我通过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