Javascript 如何使用键入克隆typescript中的对象
我正在尝试从另一个对象扩展某些属性:Javascript 如何使用键入克隆typescript中的对象,javascript,typescript,object,types,Javascript,Typescript,Object,Types,我正在尝试从另一个对象扩展某些属性: interface IAlice { foo: string; bar: string; }; interface IBob extends IAlice { aFunction(): number; anotherValue: number; }; let alice: IAlice = { foo: 'hi', bar: 'bye' }; let bob: IBob = Object.assign({}, alice); /
interface IAlice {
foo: string;
bar: string;
};
interface IBob extends IAlice {
aFunction(): number;
anotherValue: number;
};
let alice: IAlice = {
foo: 'hi',
bar: 'bye'
};
let bob: IBob = Object.assign({}, alice); // Typescript error no aFunction & anotherValue
bob.anotherValue = 2;
bob.aFunction = (): number => {
return 3;
}
如您所见,typescript返回一个错误
我知道一个可行的解决办法是使bob值可选,但这并不能解决问题。或者在Object.assign中赋值也不起作用,因为有一个函数
还有什么方法可以让typescript识别将要定义的值吗?如果
bob
属于IBob
类型,则必须始终定义IBob
的所有字段。最简单的解决方案是创建完全形成为IBob
实例的对象:
let bob: IBob = Object.assign({
anotherValue: 2,
aFunction : (): number => {
return 3;
}
}, alice);
如果要部分初始化对象,并且缺少一些字段,可以使用Partial
:
let bob: Partial<IBob> = Object.assign({}, alice);
bob.anotherValue = 2;
bob.aFunction = (): number => {
return 3;
}
重要的是要明确哪些是可选的,哪些不是可选的,这是因为在stricnullchecks
下,除非明确检查null,否则将无法访问可选字段
蛮力不安全选项是只使用类型断言使赋值生效。为了完整性,我加入了这一点,但如果可能的话,我会避免不真实的断言(你基本上是在向编译器撒谎,Object.assign
的结果包含IBob
的所有字段,它不包含这些字段,编译器将错过这些缺失字段可能导致的错误)
让bob:IBob=Object.assign({},alice)作为IBob;
//或(但仅当您不在tsx文件中时)
让bob:IBob=Object.assign({},alice);
您可以这样做:
let bob: IBob | IAlice = Object.assign({}, alice);
现在,两种类型的对象
IBob
和IAlice
都可以分配给bob
您尝试过铸造吗<代码>让bob:IBob=Object.assign({},alice);真正的问题是为什么你想让alice成为bob?这看起来不像这里想要的结果,OP正在尝试创建一个IBob
对象,而不是一个或。对于您的代码,下一行将不起作用bob.anotherValue=2;bob.affunction=():number=>{return 3;}
Schrödinger会感到自豪的
let bob: IBob = Object.assign({}, alice) as IBob;
// Or (but only if you are not in a tsx file)
let bob: IBob = <IBob>Object.assign({}, alice);
let bob: IBob | IAlice = Object.assign({}, alice);