学英语时有一个基础的语法叫做谓语动词,谓语动词指的是在句子中可以单独作谓语的动词,比如 sing,dance,rap,is 等等。
TypeScript 中有一种特殊的语法叫做类型谓词(Type Predicate),它可以帮助 TS 编译器在运行时确定变量的类型。通常是在函数中,使用谓词将不符合特定类型的值过滤掉,并将其转换为指定类型,从而避免手动类型转换的繁琐过程。
通常 TS 的类型检查都是在编译时完成的,而不是在运行时。但是,在某些情况下,编译器不能完全确定变量的类型。例如,在使用联合类型(Union Types)时,变量可能是两种或多种类型中的任意一种。这时,我们可以使用类型谓词来缩小变量的类型范围,从而让编译器能够确定变量的准确类型。
类型谓词语法
在 TypeScript 中,类型谓词使用 is
关键字来定义。语法如下:
function isType(value: any): TargetType {
// ...
}
其中,isType 是谓词的名称,value 是要判断类型的变量,TargetType 是要缩小变量类型范围的目标类型。如果谓词返回 true,TypeScript 编译器会将变量类型缩小为 TargetType。如果返回 false,则变量仍然是原来的类型。
看一个示例,有一个 Animal 类型和两个子类型 Cat 和 Dog。我们想要编写一个函数来判断一个对象是否为 Cat 类型,并在函数体内使用 Cat 类型的属性和方法。这时,我们可以使用类型谓词来缩小变量的类型范围,从而避免手动类型转换。
interface Animal {
name: string;
}
interface Cat extends Animal {
purr: () => void;
}
interface Dog extends Animal {
bark: () => void;
}
function isCat(animal: Animal): animal is Cat {
return (animal as Cat).purr !== undefined;
}
function makeSound(animal: Animal) {
if (isCat(animal)) {
animal.purr();
} else {
animal.bark();
}
}
在上面的例子中,我们使用 isCat 谓词来判断 animal 是否为 Cat 类型。如果是,我们就可以在函数体内使用 animal 的 purr 方法。如果不是,则 animal 被缩小为 Animal 类型,我们可以使用 bark 方法。
注意,isCat 函数的返回值是一个类型谓词,它告诉编译器 animal 是否为 Cat 类型。如果返回值为 true,编译器就会将 animal 缩小为 Cat 类型,否则就保持原来的 Animal 类型。
总结
类型谓词是一种在运行时帮助 TypeScript 编译器确定变量类型的语法。使用谓词可以缩小变量类型的范围,从而避免手动类型转换。谓词语法简单,只需要使用 is 关键字定义函数,指定目标类型即可。