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);