Typescript:如何扩展嵌套字段的接口并向对象赋值?

Ste*_*611 2 typescript

考虑以下接口:

interface MyType1 {
  field1: string;
    options: {
        basicOption1: string;
        basicOption2: string; 
    };
}

interface MoreOptions {
    moreOptions1: string;
    moreOptions2: string;
}
Run Code Online (Sandbox Code Playgroud)

我扩展了接口 MyType1 的字段选项:

interface MyType2 extends MyType1{
    options: {
        basicOption1: string; // How to remove it, yet declared in MyType1
        basicOption2: string; // How to remove it, yet declared in MyType1
        moreOptions1: string;
        moreOptions2: string; 
    };
}
Run Code Online (Sandbox Code Playgroud)

如果我省略行 :basicOptions1:string;basicOptions2:string;,编译器会抱怨。所以,我添加它们。但是,是否可以删除它们并仅保留行 :moreOptions1:string;moreOptions2:string;其他选项。

接下来,如何Mytype2从两个类型为MyType1和的对象分配一个类型的对象MoreOptions

例如(Rq:我测试了其他东西但也不成功):

let myobj1: MyType1 = { field1:"field1", options:{ basicOption1:"basicOption1", basicOption2:"basicOption2" } };
let moreOptions: MoreOptions = { moreOptions1: "moreOptions1", moreOptions2: "moreOptions2" }

let myobj2: MyType2 = { ...myobj1, options: {...moreOptions} };
Run Code Online (Sandbox Code Playgroud)

bel*_*a53 7

您可以交叉所需的属性类型options

interface MyType2 extends MyType1 {
    options: MyType1["options"] & MoreOptions
}
Run Code Online (Sandbox Code Playgroud)

关于MyType2 extends MyType1和错误:

MyType1like中的现有属性options必须与 中的相同MyType2,它们不会以某种方式被覆盖或合并。其他属性如field1自动结转。


接下来,如何从 MyType1 和 MoreOptions 类型的两个对象分配 Mytype2 类型的对象?

您可以使用对象展开,这将合并所有对象,并且如果属性名称相同,请选择最右边的对象(Playground 示例):

declare const t1: MyType1;
declare const moreOpt: MoreOptions;
const t2: MyType2 = {...t1, options: {...t1.options, ...moreOpt}};
Run Code Online (Sandbox Code Playgroud)