interface a {
a:number;
}
interface b {
b:number;
}
type c = a|b;
const arr:c=[{a:1},{b:2},{b:1}];
当我要帅选出所有a类型数据时,用filter判断是否有a属性;
const filterarr=arr.filter(i=> i.hasownproperty('a'));
此时你会发现 ts的推导类型并没有改变,还是c [ ]
;
这时候点进去filter的ts定义:
可以看到filter是接受泛型的:泛型s受t约束;
此时我们传入类型a:
const filterarr=arr.filter<a>(i=> i.hasownproperty('a'));
可以看到一个"类型xxx必须为类型谓词"
这个时候就会疑惑 啥是类型谓词;
仔细看就是发现这里和我们想像的不一样:value is s
是什么东西?不应该是boolean吗?
typescript 中的 is
关键字,它被称为类型谓词,用来判断一个变量属于某个接口或类型。
const isa = (i: c): i is a => {
return i.hasownproperty('a');
};
此时就可以了,filter函数筛选类型时 要返回一个类型谓词;要不然ts是不知道你缩减了类型的;
发表评论