Typescript 通用数组类型和推送项

标签 typescript typescript-typings

我正在尝试创建一个通用函数来处理各种类型的数组(它们只共享一些共同的属性)并执行简单的操作,例如删除或添加项目。打字员应该如何寻找这样的功能?

interface A {
    value: number;
    aasdsad?: number;
    abc: string;
}

interface B {
    value: number;
    asdsad1?: string;
}

export class Main {

    public getOneOfTheArrays(): A[] | B[] {
        return []; // return A[] or B[] depending on certain conditions
    }

    public getValue(index: number) {
        const arr: A[] | B[] = this.getOneOfTheArrays();
        const a = this.copy(arr[index]);
        a.value = 1234;
        arr.push(a); // <- typing's error here
    }

    public copy(obj: A | B): A | B {
        return Object.assign({}, obj);
    }

}

DEMO1 DEMO2

错误: arr.push(a) -> 'A | 类型的参数B' 不可分配给类型为“A & B”的参数。 类型“B”不可分配给类型“A & B”。 属性“abc”在类型“B”中缺失,但在类型“A”中是必需的。

目前的解决方案: (arr as typeof a[]).push(a);

最佳答案

你不能推 A | BA[] | B[] 仅当 a 是 typeof Barr typeof A[] 因为类型 B 缺少 abc 属性。

您可以在以下情况下推送它:

arr.push(a as A);
(arr as B[]).push(a as B);
(arr as B[]).push(a as A);

因此,您必须以某种方式检查 i 是 a 是 B 还是 arr 是 A[],并且在这种情况下应用一些不同的逻辑。

Playground

关于Typescript 通用数组类型和推送项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54627951/

相关文章:

typescript - 在 TypeScript 中构建机会 Mixin

typescript - 如何输入以接口(interface)作为参数的方法

generics - 在 Typescript 中创建通用方法装饰器

web - 使用 Angular 2+ 检测输入焦点

javascript - Elasticsearch-模糊搜索未给出建议

typescript - 将表达式从三元转换为逻辑运算符

typescript - 如何将 super 的类型分配给子构造函数

javascript - Typescript嵌套函数包装返回类型问题

使用 Google Analytics 的 Angular 4+

java - 有什么方法可以在 Java 中返回多态 this 吗?