我正在尝试创建一个通用函数来处理各种类型的数组(它们只共享一些共同的属性)并执行简单的操作,例如删除或添加项目。打字员应该如何寻找这样的功能?
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);
}
}
错误: arr.push(a)
-> 'A | 类型的参数B' 不可分配给类型为“A & B”的参数。
类型“B”不可分配给类型“A & B”。
属性“abc”在类型“B”中缺失,但在类型“A”中是必需的。
目前的解决方案: (arr as typeof a[]).push(a);
最佳答案
你不能推 A | B
到 A[] | B[]
仅当 a
是 typeof B
和 arr
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[],并且在这种情况下应用一些不同的逻辑。
关于Typescript 通用数组类型和推送项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54627951/