[英]typescript generic type guard
我的變量可以是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
未編譯。
這里有多個問題:
isC
函數需要Foo
作為類型參數。 這意味着需要這樣聲明:
private isC<Foo>(...
isC
的返回類型定義與它的輸入參數不匹配。 當其參數d
的類型為C<Foo>[]
,返回類型聲明isC
返回true
,但是輸入類型限於Foo[]
或C<Foo>
(它們都不是C<Foo>[]
)。 。
該聲明應該起作用:
private isC<Foo>(d: Foo[] | C<Foo>[]): d is C<Foo>[] { ...
(<C<Foo>>)d[0]
不是有效的類型轉換。 試試這個,代替:
return (d as C<Foo>[])[0].key !== undefined
另請參閱帶有編譯示例的操場 。
我面臨着同樣的問題,我寫了這個小函數:
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
private isC(d: Foo[] | C<Foo>): d is C<Foo>[] {
return (d as C<Foo>[])[0].key !== undefined
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.