Typescript接口对象属性值作为键

Typescript接口对象属性值作为键,typescript,generics,typescript-typings,Typescript,Generics,Typescript Typings,当试图将对象数组映射到具有相同对象但使用属性值作为索引键的数组时,我尝试为各种情况创建正确的键入 接口值定义{ 名称:字符串; } 函数getByName(值定义:V[]){ 放出={} for(值定义中的常量键){ out[valuedefinitions[key].name]=valuedefinitions[key]; } 返回; } 常量对象:值定义={ 名称:“超级” }; const objKey=getByName([ obj ]); key.super;//此输出的打字 我在

当试图将对象数组映射到具有相同对象但使用属性值作为索引键的数组时,我尝试为各种情况创建正确的键入

接口值定义{
名称:字符串;
}
函数getByName(值定义:V[]){
放出={}
for(值定义中的常量键){
out[valuedefinitions[key].name]=valuedefinitions[key];
}
返回;
}
常量对象:值定义={
名称:“超级”
};
const objKey=getByName([
obj
]);
key.super;//此输出的打字
我在找这样的东西:

type WithKey<D extends ValueDefinition> = {
    [key: D['name']]: D;
}
type with key={
[key:D['name']]:D;
}

谢谢。

您应该在
名称
属性的字符串文字类型中将
值定义
接口设置为通用接口,以便以后提取:

interface ValueDefinition<K extends string = string> {
    name: K
}
并将
getByName
的签名修改为
name
literals集合中的通用签名:

function getByName<K extends string>(valuDefinitions: Array<ValueDefinition<K>>): ValueDefinitionObject<K> {
    let out = {} as ValueDefinitionObject<K>
    for (const key in valuDefinitions) {
        out[valuDefinitions[key].name] = valuDefinitions[key];
    }
    return out;
}
好的,让我们试试(我正在添加另一个):

如果检查它们,它们将显示为
ValueDefinition
ValueDefinition

const objKey = getByName([obj, obj2]);  
objKey
被键入为
ValueDefinitionObject
。让我们使用它:

objKey.super; // okay, ValueDefinition<'super'>
objKey.thing; // okay, ValueDefinition<'thing'>
objKey.nope; // error, property 'nope' doesn't exist
objKey.super;//好的,价值定义
objKey.thing;//好的,价值定义
objKey.nope;//错误,属性“nope”不存在

这对你有用吗?祝你好运

您应该在
name
属性的字符串文字类型中使
ValueDefinition
接口成为通用接口,以便以后可以提取它:

interface ValueDefinition<K extends string = string> {
    name: K
}
并将
getByName
的签名修改为
name
literals集合中的通用签名:

function getByName<K extends string>(valuDefinitions: Array<ValueDefinition<K>>): ValueDefinitionObject<K> {
    let out = {} as ValueDefinitionObject<K>
    for (const key in valuDefinitions) {
        out[valuDefinitions[key].name] = valuDefinitions[key];
    }
    return out;
}
好的,让我们试试(我正在添加另一个):

如果检查它们,它们将显示为
ValueDefinition
ValueDefinition

const objKey = getByName([obj, obj2]);  
objKey
被键入为
ValueDefinitionObject
。让我们使用它:

objKey.super; // okay, ValueDefinition<'super'>
objKey.thing; // okay, ValueDefinition<'thing'>
objKey.nope; // error, property 'nope' doesn't exist
objKey.super;//好的,价值定义
objKey.thing;//好的,价值定义
objKey.nope;//错误,属性“nope”不存在

这对你有用吗?祝你好运

这些名字在编译时是已知的吗?是的,这些名字是已知的。这些名字在编译时是已知的吗?是的,这些名字是已知的。你打败了我:)@TitianCernicova Dragomir哦,对不起!很好,很公平:)你比我先:)@TitianCernicova Dragomir哦,对不起!很好,很公平:)