我正在尝试实现一个自定义的typeguard函数,该函数检查给定值是否为给定类的实例。
我尝试通过以下方式实现相同的目标:
function isObject<T>(value: any, className: T = Object as any): value is T {
return (
value &&
typeof value === 'object' &&
value instanceof (className as any)
);
}
let myObj:Foo;
if(isObject(fooObj, Foo)) {
myObj = fooObj;
}
但是上面给出的代码抛出一个错误:
Type 'typeof Foo' is not assignable to type 'Foo'
答案 0 :(得分:2)
问题在于,因为您传递了Foo
,因为第二个参数T
最终将代表该类而不是该类的实例。您可以使用InstanceType
条件类型提取实例:
class Foo { private x: null}
function isObject<T extends new (...a: any[])=> any>(value: any, className: T = Object as any): value is InstanceType<T> {
return (
value &&
typeof value === 'object' &&
value instanceof (className as any)
);
}
let fooObj: unknown;
let myObj:Foo;
if(isObject(fooObj, Foo)) {
myObj = fooObj;
}
注意 istanceof
本身将充当类型保护。