首页 > 解决方案 > 打字稿函数的返回类型可以由参数确定吗

问题描述

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

标签: typescripttypescript-generics

解决方案


是的,只需为属性名称创建一个类型参数:

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

游乐场链接


推荐阅读