' is '关键字在typescript中有什么作用?

我遇到的一些代码是这样的:

export function foo(arg: string): arg is MyType {
return ...
}

我还没能在文档或谷歌中搜索到is,这是一个相当常见的词,基本上在每一页都有。

关键字在这个上下文中做什么?

100244 次浏览

我知道的唯一用法是你的例子:在用户定义的type Guard中指定“type predicate”(arg is MyType)

请参见参考中的用户定义类型保护

这里是另一个参考

更多信息请参见用户定义类型保护函数的参考。

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()被调用后,如果函数返回trueTypeScript将在函数调用保护的任何块中将类型缩小为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的优势。