我有变量,可以是C1[]
或C2<C1>[]
类型如何为变量创建类型保护?
interface C<T>{
key: string;
secret: T;
}
private isC(d: Foo[] | C<Foo>): d is C<Foo>[] {
return (<C<Foo>>)d[0].key !== undefined
}
方法isC
未编译。
答案 0 :(得分:1)
这里有多个问题:
isC
函数需要Foo
作为类型参数。这意味着它需要像这样声明:
private isC<Foo>(...
isC
的返回类型定义与其输入参数不匹配。返回类型声明isC
返回true
,其参数d
的类型为C<Foo>[]
,但输入类型仅限于Foo[]
或{{1 (它们都不是C<Foo>
)。
此声明应该有效:
C<Foo>[]
private isC<Foo>(d: Foo[] | C<Foo>[]): d is C<Foo>[] { ...
不是有效的类型广播。试试这个,而不是:
(<C<Foo>>)d[0]
答案 1 :(得分:1)
我正面临着同样的问题,我写了这个小功能:
function isTypeOf<K>(arg: any): arg is K {
let result: boolean = false;
const targetedType = { ...arg } as K;
Object.keys(arg).forEach((prop: string) => {
result = some(Object.keys(targetedType), (x: string) => x === prop);
});
return result;
}
遗憾的是,唯一的方法是根据目标类型来测试'arg'上是否存在属性...
*“某些”功能来自lodash
答案 2 :(得分:0)
private isC(d: Foo[] | C<Foo>): d is C<Foo>[] {
return (d as C<Foo>[])[0].key !== undefined
}