【发布时间】:2019-10-22 01:31:45
【问题描述】:
我一直在尝试使用 Typescript 使用 switch case 来映射值。例如,获取数字的字符串版本。
function getNumber(id) {
switch (id) {
case 1:
return 'one';
case 2:
return 'two';
case 3:
return 'three';
}
}
我想使用 Typescript 来确保传递了一个有效的密钥,因此我尝试了以下接口并使用它来提取允许的密钥
interface Numbers {
1: 'one';
2: 'two';
3: 'three';
}
function getNumber<K extends keyof Numbers>(id: K) {
}
到目前为止一切顺利!事实上,如果我尝试 getNumber(4) 我会得到一个错误。
问题发生在返回类型上。我期待Numbers[K] | void 被退回。
function getNumber<K extends keyof Numbers>(id: K): Numbers[K] | void {
switch (id) {
case 1:
return 'one';
case 2:
return 'two';
case 3:
return 'three';
}
}
但是,我收到了错误 Type '"one"' is not assignable to type 'void | Numbers[K]'.ts(2322)。
我在 TS 3.5.1 和以前的版本中看到了这个问题。
有什么想法吗?
【问题讨论】:
-
您要返回
Numbers[K] | void还是Number | void? -
this change 的另一个牺牲品,has broken some things 以健全的名义。实际上,您必须使用断言之类的东西。
-
如果可以的话,我会切换到this form...但不确定它是否适合您的用例
-
您的代码可以工作in the playground,我在本地项目中对其进行了测试,没有出现错误……
-
这是 Github 中的 very similar issue... 标记为“按预期工作”,所以我猜这里的答案是断言。
标签: typescript