我有一个函数,其中一个参数是一个字符串数组。它返回一个对象,其中所有键都是该字符串数组中的值。是否可以使 Typescript 中函数的返回类型反映这一点?
我认为用一个例子更好地解释这一点:
const clientConfigs =
getClientConfigs(clientId, ['timeZone', 'flagRequireTwoApprovals']);
// Above function will return a value for each requested configuration.
// This will look something like:
// {
// "timeZone": "America/New_York",
// "flagRequireTwoApprovals": true
// }
// At this point, the type of clientConfigs is: Record<string, any>
// HOWEVER, I want the type to be:
// Record<'timeZone'|'flagRequireTwoApprovals', any>
// I want this to be identified as error, because I
// forgot to capitalize "Z" in "timeZone":
const clientTime = moment.tz(clientConfigs.timezone).toISOString();
// I want this to be identified as error, because I
// forgot to retrieve the "adminEmail" config:
await sendEmail({to: configs.adminEmail, body: "Failed to whatever ......"});
答案 0 :(得分:1)
是的,只需为属性名称设置一个类型参数:
function test<K extends string>(keys: K[]): Record<K, any> {
const r: Record<K, any> = Object.create(null);
keys.forEach(k => r[k] = 'foobar');
return r;
}
用法:
// obj: Record<'foo' | 'bar' | 'baz', any>
const obj = test(['foo', 'bar', 'baz']);