Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.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,我有一堆数据,它们内置在一个对象文本中。此对象的键也存在于此对象中的每个子对象中,我希望通过typescript强制执行此操作: type People = {[NAME in string]: { name: NAME; age: number }}; const people: People = { Jeff: { name: "Jeff", age: 30 }, Fred: { name: "Freddy", age: 25 }, // no error, name ev

我有一堆数据,它们内置在一个对象文本中。此对象的键也存在于此对象中的每个子对象中,我希望通过typescript强制执行此操作:

type People = {[NAME in string]: { name: NAME; age: number }};

const people: People = {
    Jeff: { name: "Jeff", age: 30 },
    Fred: { name: "Freddy", age: 25 }, // no error, name evaluates to string
    Sally: { name: "Sally", age: 35 },
};
在过去,我使用字符串联合做过类似的事情:

type People = {[NAME in "Jeff" | "Fred" | "Sally"]: { name: NAME; age: number }};

const people: People = {
    Jeff: { name: "Jeff", age: 30 },
    Fred: { name: "Freddy", age: 25 }, // ERROR: Type '"Freddy"' is not assignable to type '"Fred"'.  ts(2322)
    Sally: { name: "Sally", age: 35 },
};
但是对于我当前的用例,除了对象之外,维护一个单独的联合类型将是过分的


是否可以在该对象的子对象中使用索引对象的键类型?

我能做的最好的事情如下:

type People={[K in keyof T]:{name:K;age:number};
函数createPeople(人:T):人{
还人,;
}
const people=createPeople({
杰夫:{姓名:“杰夫”,年龄:30},
弗雷德:{name:'Freddy',age:25},//错误:类型'Freddy'不能分配给类型'Fred'。ts(2322)
莎莉:{姓名:'Sally',年龄:35},
});

您当前的用例是什么?我不知道这是否可行,但如果不可行,我也不会太惊讶——像这样复制感觉很糟糕。@gqstav我正在尝试向JSON中定义的现有模式格式添加类型。它用一个匹配的键和
typename
prop在一个平面对象中定义了它的所有类型。在我的用例中不太合适,但我真的认为这是我将要得到的最接近的-谢谢!