考虑以下接口:
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)
您可以交叉所需的属性类型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)
| 归档时间: |
|
| 查看次数: |
1746 次 |
| 最近记录: |