打字稿通用型警卫

时间:2017-12-27 18:01:47

标签: javascript typescript types casting

我有变量,可以是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未编译。

3 个答案:

答案 0 :(得分:1)

这里有多个问题:

  1. isC函数需要Foo作为类型参数。这意味着它需要像这样声明:

    private isC<Foo>(...
    
  2. isC的返回类型定义与其输入参数不匹配。返回类型声明isC返回true,其参数d的类型为C<Foo>[],但输入类型仅限于Foo[]或{{1 (它们都不是C<Foo>)。

    此声明应该有效:

    C<Foo>[]
  3. private isC<Foo>(d: Foo[] | C<Foo>[]): d is C<Foo>[] { ... 不是有效的类型广播。试试这个,而不是:

    (<C<Foo>>)d[0]
  4. 另见playground with compiling example

答案 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
}