我们说我有一个is
功能,基本上这就是它的工作原理。
is(Array, []) // true
is(String, '') // true
因为它是一个javascript函数,我需要为它创建一个单独的打字稿定义。
现在我可以简单地实现以下界面,
is(ctor: any, val: any): boolean;
但是这个定义还不够好,因为我运行if(is(Array, stuffA)) { ... }
之后 if block <中的typescirpt编译器无法推断stuffA
的类型 /强>
如何为is
函数设置类型断言?
答案 0 :(得分:3)
签名应如下所示:
function is<T>(type: { new(): T }, obj: any): obj is T
这将确保编译器理解正确的类型,即此函数被视为a type guard。
我也有这样的功能:
function is<T>(obj: any, type: { new(): T }): obj is T {
if (Number.isNaN(type as any) && Number.isNaN(obj)) {
return true;
}
let objType: string = typeof obj;
let nameRegex: RegExp = /Arguments|Function|String|Number|Date|Array|Boolean|RegExp/;
if (obj && objType === "object") {
return obj instanceof type;
}
let typeName: RegExpMatchArray = type.toString().match(nameRegex);
if (typeName) {
return typeName[0].toLowerCase() === objType;
}
return false;
}
使用此功能时,我们总是传递一个实例,然后传递该类
由于我们希望函数涵盖所有类型,我们将使用泛型,其中T
是传递的实例的类型。
如果T
是实例的类型,则类的类型为:
{ new(): T }
&#34;打字稿方式&#34;描述一个控制者对象(也是一个类) 更多信息可以在这里找到:Difference between the static and instance sides of classes。