在TypeScript中使用is运算符的原因是什么?

在TypeScript中使用is运算符的原因是什么?,typescript,typescript2.0,Typescript,Typescript2.0,在这种情况下,在TypeScript中使用is运算符的原因是什么 type Species = "cat" | "dog"; interface Pet { species: Species } interface Cat extends Pet { } function petIsCat(pet: Pet): pet is Cat { return pet.species === "cat"; } 如果body返回bool type,为什么要使用petis Cat而不是

在这种情况下,在TypeScript中使用is运算符的原因是什么

type Species = "cat" | "dog";


interface Pet {
   species: Species
}

interface Cat extends Pet {

}

function petIsCat(pet: Pet): pet is Cat {
   return pet.species === "cat";
}

如果body返回bool type,为什么要使用
petis Cat
而不是
boolean

boolean只是一种数据类型,而'is'运算符用于类型测试。让我稍微改变一下你的例子:

type Species = 'cat' | 'dog';

interface Pet {
    species: Species;
}

class Cat implements Pet {
    public species: Species = 'cat';
    public meow(): void {
        console.log('Meow');
    }
}

function petIsCat(pet: Pet): pet is Cat {
    return pet.species === 'cat';
}

function petIsCatBoolean(pet: Pet): boolean {
    return pet.species === 'cat';
}

const p: Pet = new Cat();

p.meow(); // ERROR: Property 'meow' does not exist on type 'Pet'.

if (petIsCat(p)) {
    p.meow(); // now compiler is know for sure that the variable is of type Cat and it has meow method
}

if (petIsCatBoolean(p)) {
    p.meow(); // ERROR: Property 'meow' does not exist on type 'Pet'.
}
当然,您可以使用类型转换:

(<Cat>p).meow(); // no error
(p as Cat).meow(); // no error
(p).meow();//无误
(p作为猫)。喵喵()无误

但这取决于场景。

它有助于编译器(和Intellisense)更好地理解代码中的类型。到底是什么让你在官方文件中感到困惑?这是否意味着我可以使用布尔值?从运行时的角度看,这没有什么区别(生成的JS代码是相同的)。开发人员在时间上使用
is
可能会帮助您发现代码的潜在问题。好吧,为什么
是Cat{}
,而
pet是Cat{}
?为什么我们要检查两个传入的pet参数?@OPV因为函数可以有更多的参数,所以只能缩小一个参数。编译器需要知道哪一个参数