簡體   English   中英

打字稿通用類型保護

[英]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未編譯。

這里有多個問題:

  1. isC函數需要Foo作為類型參數。 這意味着需要這樣聲明:

     private isC<Foo>(... 
  2. isC的返回類型定義與它的輸入參數不匹配。 當其參數d的類型為C<Foo>[] ,返回類型聲明isC返回true ,但是輸入類型限於Foo[]C<Foo> (它們都不是C<Foo>[] )。 。

    該聲明應該起作用:

     private isC<Foo>(d: Foo[] | C<Foo>[]): d is C<Foo>[] { ... 
  3. (<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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM