【发布时间】:2019-10-15 20:16:03
【问题描述】:
我正在尝试编写一个函数,该函数将接受一个字符串文字并返回一个具有单个字段的对象,该字段的名称是该字符串文字。我可以编写一个函数来做我想做的事,但是我不知道如何表达它的参数类型是字符串文字的约束。
我最接近的是使用扩展string 的泛型类型。这允许字符串文字类型,但也允许字符串文字类型和类型 string 的联合,我不想将其传递给我的函数。
如果K 是字符串文字类型,这将编译并执行我想要的操作。请注意,类型断言在 typescript 3.4 中不是必需的,但在 3.5 中是必需的。
function makeObject<K extends string>(key: K): { [P in K]: string } {
return { [key]: "Hello, World!" } as { [P in K]: string };
}
如果K 不是字符串字面量,则此函数的返回类型将与它返回的值的类型不同。
我能想到的实现这项工作的两条途径是:
- 将 K 限制为仅字符串文字
- 表示返回类型是具有单个字段的对象,其名称是 K 中的值(不太令人满意,但至少函数的类型会诚实)
typescript 的类型系统可以表达这些吗?
如果我删除 typescript 3.5 中的类型断言,我会收到错误:
a.ts:2:3 - error TS2322: Type '{ [x: string]: string; }' is not assignable to type '{ [P in K]: string; }'.
2 return { [key]: "Hello, World!" };
【问题讨论】:
-
不确定结果应该是什么。
makeObject("a" as "a" | "b");应该返回什么?{ a?: string; b?: string; }也许?如果K不是单个字符串文字(即不是联合),我们可以触发错误这是你想要的吗? -
理想情况下,您的示例会导致类型错误,因为参数是字符串文字的联合,而不是字符串文字。
标签: typescript