Typescript 允许成员实现扩展另一个接口的任何接口的记录
这是我当前的代码:Typescript 允许成员实现扩展另一个接口的任何接口的记录,typescript,Typescript,这是我当前的代码: 接口hasFoo{ foo:string; } 接口hasBar扩展了hasFoo{ 酒吧:字符串; } 接口hasBaz扩展了hasFoo{ baz:字符串; } 常量myRecord:记录={ “a”:{ 福:“你好”, 酒吧:“世界”, }, “b”:{ 福:“再见”, 巴兹:“我的爱人”, }, “c”:{ 福:“长春花”, }, } 但是,这不起作用(类型“hasFoo”中不存在“bar”)。我可以做Record,但如果我添加更多扩展hasFoo的接口,这将很快
接口hasFoo{
foo:string;
}
接口hasBar扩展了hasFoo{
酒吧:字符串;
}
接口hasBaz扩展了hasFoo{
baz:字符串;
}
常量myRecord:记录={
“a”:{
福:“你好”,
酒吧:“世界”,
},
“b”:{
福:“再见”,
巴兹:“我的爱人”,
},
“c”:{
福:“长春花”,
},
}
但是,这不起作用(
类型“hasFoo”中不存在“bar”
)。我可以做Record
,但如果我添加更多扩展hasFoo
的接口,这将很快变得很麻烦。相反,我想要类似于记录的东西。可以这样做吗?您正在尝试创建hasFoo
,编译器给出错误,因为bar
或baz
未在hasFoo
中定义。但是,正如您所看到的,类型转换实际上按照预期工作
const myRecord: Record<string, hasFoo> = {
"a": {
foo: "hello",
bar: "world",
} as hasBar,
"b": {
foo: "goodbye",
baz: "my lover",
} as hasBaz,
"c": {
foo: "periwinkle",
},
}
const myRecord:Record={
“a”:{
福:“你好”,
酒吧:“世界”,
}作为哈斯巴尔,
“b”:{
福:“再见”,
巴兹:“我的爱人”,
}作为哈斯巴兹,
“c”:{
福:“长春花”,
},
}
或
const myRecord:Record={
“a”:{
福:“你好”,
酒吧:“世界”,
} ,
“b”:{
福:“再见”,
巴兹:“我的爱人”,
} ,
“c”:{
福:“长春花”,
},
}记录在案
您可以使用
const myRecord: Record<string, Record<string,string> & hasFoo> = {
"a": {
foo: "hello",
bar: "world",
},
"b": {
foo: "goodbye",
baz: "my lover",
},
"c": {
foo: "periwinkle",
},
}
const myRecord:Record={
“a”:{
福:“你好”,
酒吧:“世界”,
},
“b”:{
福:“再见”,
巴兹:“我的爱人”,
},
“c”:{
福:“长春花”,
},
}
它的维护比
const myRecord2: Record<string, hasBar | hasBaz | hasFoo> = {
"a": {
foo: "hello",
bar: "world",
},
"b": {
foo: "goodbye",
baz: "my lover",
},
"c": {
foo: "periwinkle",
},
}
const myRecord2:记录={
“a”:{
福:“你好”,
酒吧:“世界”,
},
“b”:{
福:“再见”,
巴兹:“我的爱人”,
},
“c”:{
福:“长春花”,
},
}
是的,我现在正在使用此解决方案,但我想知道是否有一种方法可以为记录定义更松散的类型。这允许向记录添加属性,例如“d”:{foo:“good”,boo:“ghost”}
,但是我只希望能够添加符合hasFoo
的属性,或者任何扩展hasFoo
的接口。然后,您必须使用union,扩展不允许您添加扩展类型上不存在的属性。基本上,任何满足hasFoo定义的类型都被认为是根据typescript匹配它的。如果只想使用扩展它的接口,则必须列出它们以忽略其他匹配类型。
const myRecord2: Record<string, hasBar | hasBaz | hasFoo> = {
"a": {
foo: "hello",
bar: "world",
},
"b": {
foo: "goodbye",
baz: "my lover",
},
"c": {
foo: "periwinkle",
},
}