我认为这个问题的标题不是很好,但是我想出更好的东西是困难的,所以现在就可以了。
我也很确定我想要的东西不受支持,但是我很乐意被证明是错误的!
我有一个正在调用的API,它会根据查询改变返回的对象中的成员名称。
例如
GetInfo(languages?:string[]);
GetInfo() => { name: "Cologne" };
GetInfo(["en", "de"]) => { name: "Cologne", name_en: "Cologne", name_de: "Köln" };
有没有一种方法可以创建将“生成” name_ {language}成员的定义?
答案 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建议添加对字符串文字操作的支持,但目前尚无路可走