为什么使用带排列的复制时没有类型错误



我通过map函数复制对象数组。为什么一个新的属性";xxx"?新特性";xxx";没有在接口中声明?

interface A{
a:number;
b:string;
};
let a:A[] = [{a:1, b:"a"}, {a:2, b:"b"}];
let b:A[] = a.map((x)=>({...x, xxx:"abc"}));

因为变量b仍然可分配给a

考虑下一个例子:

interface A {
a: number;
b: string;
};
interface B {
a: number;
b: string;
xxx: string;
}
declare var a: A[]
declare var b: B[]
a = b // ok
b = a // error

b包含来自a的所有属性,因此将b分配给a是安全的。

另一方面,将a分配给b是不保存的。

interface A {
a: number;
b: string;
};
interface B {
a: number;
b: string;
xxx: string;
}

let a:B[] = [{a:1, b:"a"}, {a:2, b:"b"}]; // error

因为它们是协变的。

如果你正在寻找相反,考虑这个例子:

interface A {
a: number;
b: string;
};
interface B {
a: number;
b: string;
xxx: string;
}
class C<T>{
method = (a: T) => { }
}
let a: C<A> = new C()
let b: C<B> = new C()
// vice versa
a = b // error
b = a // ok

最新更新