打字稿函数的返回类型可以由参数确定吗

时间:2021-07-28 19:09:04

标签: typescript typescript-generics

我有一个函数,其中一个参数是一个字符串数组。它返回一个对象,其中所有键都是该字符串数组中的值。是否可以使 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 ......"});

1 个答案:

答案 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']);

Playground Link

相关问题