function isString(test: any): test is string{
return typeof test === "string";
}
function example(foo: any){
if(isString(foo)){
console.log("it is a string" + foo);
console.log(foo.length); // string function
}
}
example("hello world");
使用上述格式的类型谓词test is string(而不是仅使用boolean作为返回类型),在isString()被调用后,如果函数返回true, TypeScript将在函数调用保护的任何块中将类型缩小为string。
编译器会认为foo在下面保护的块中是string(并且仅在下面保护的块中)
{
console.log("it is a string" + foo);
console.log(foo.length); // string function
}
类型谓词只在编译时使用。结果的.js文件(运行时)将没有区别,因为它不考虑TYPE。
我将在下面四个例子中说明它们的区别。
< p > E。g 1:
上面的示例代码将不会有编译错误或运行时错误
< p > E。g 2:
下面的示例代码将有一个编译错误(以及一个运行时错误),因为TypeScript已经将类型缩小到string,并检查了toExponential不属于string方法
function example(foo: any){
if(isString(foo)){
console.log("it is a string" + foo);
console.log(foo.length);
console.log(foo.toExponential(2));
}
}
< p >。3:
下面的示例代码没有编译错误,但会有一个运行时错误,因为TypeScript只会在被保护的块中将类型缩小为string,而不会在后面,因此foo.toExponential不会创建编译错误(TypeScript不认为它是string类型)。然而,在运行时,string没有toExponential方法,所以它会有运行时错误
function example(foo: any){
if(isString(foo)){
console.log("it is a string" + foo);
console.log(foo.length);
}
console.log(foo.toExponential(2));
}
< p >。4:
如果我们不使用test is string(类型谓词),TypeScript将不会在被保护的块中缩小类型,下面的示例代码将不会有编译错误,但会有运行时错误
function isString(test: any): boolean{
return typeof test === "string";
}
function example(foo: any){
if(isString(foo)){
console.log("it is a string" + foo);
console.log(foo.length);
console.log(foo.toExponential(2));
}
}
结论是在编译时使用test is string(类型谓词)来告诉开发人员代码将有机会出现运行时错误。对于javascript,开发人员在编译时不会知道错误。这是使用TypeScript的优势。