gpt4 book ai didi

javascript - 如何使用打字克隆 typescript 中的对象

转载 作者:搜寻专家 更新时间:2023-10-30 21:27:20 25 4
gpt4 key购买 nike

我正在尝试从另一个对象扩展一些属性:

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 识别将要定义的值?

最佳答案

如果 bobIBob 类型,它必须始终定义 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;
}

这将使所有字段成为可选字段,这可能并非在所有情况下都适用,但最好将 Partial 作为一个选项牢记在心。

如果你真的想打字,你甚至可以只将 IBob 的字段设为可选,同时将 IAlice 的字段设为必填

let bob: Partial<Pick<IBob, Exclude<keyof IBob, keyof IAlice>>> & IAlice = Object.assign({}, alice);

bob.anotherValue = 2;
bob.aFunction = (): number => {
return 3;
}

明确说明什么是可选的,什么不是可选的很重要的原因是,在 strictNullChecks 下,您将无法访问可选字段,除非您明确检查 null。

蛮力不安全选项是仅使用类型断言来使分配工作。我包括这个是为了完整性,但如果可能的话我会避免不正确的断言(你基本上是在欺骗编译器 Object.assign 的结果具有 IBob 的所有字段> 它不会,编译器将错过可能由这些缺失字段引起的错误)

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

关于javascript - 如何使用打字克隆 typescript 中的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51895766/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com