Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Typescript 允许成员实现扩展另一个接口的任何接口的记录_Typescript - Fatal编程技术网

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",
  },
}