有没有办法在TypeScript定义中动态生成成员?

时间:2018-11-13 10:21:00

标签: typescript

我认为这个问题的标题不是很好,但是我想出更好的东西是困难的,所以现在就可以了。

我也很确定我想要的东西不受支持,但是我很乐意被证明是错误的!

我有一个正在调用的API,它会根据查询改变返回的对象中的成员名称。

例如

GetInfo(languages?:string[]);
GetInfo() => { name: "Cologne" };
GetInfo(["en", "de"]) => { name: "Cologne", name_en: "Cologne", name_de: "Köln" };

有没有一种方法可以创建将“生成” name_ {language}成员的定义?

1 个答案:

答案 0 :(得分:1)

不支持以这种方式操纵属性名称(即,将一个字符串连接到另一个字符串并将其作为类型检查的属性)。

您能做的最好的事情不只是返回一个属性与语言名称相同的对象:

function GetInfo<T extends string>(langs: T[]): Record<T | 'default', string>{
  return null as any;
}
let values = GetInfo(["en", "de"]) // values is  { en: string; de: string; default: string  }
values.default
values.de
values.en

在GitHub上有一个issue建议添加对字符串文字操作的支持,但目前尚无路可走