【发布时间】:2019-05-19 18:41:39
【问题描述】:
我在尝试使用 TypeScript 实现函数重载时遇到了一个小问题,其中一个枚举作为参数传递,第二个参数的类型取决于枚举。
例如:
- 如果枚举是
FOO,那么第二个参数是string类型 - 如果枚举是
BAR,那么第二个参数是number类型 - 如果枚举为
BAZ,则没有第二个参数
我的代码如下,但不知何故 TypeScript 会抛出错误,因为即使我根据枚举检查第一个参数,intellisense 也不会缩小第二个参数的类型:fieldValue 始终是@987654328 @。
enum ViewName {
FOO = 'foo',
BAR = 'bar',
BAZ = 'baz'
}
function myFunction(viewName: ViewName.FOO, stringValue: string);
function myFunction(viewName: ViewName.BAR, numberValue: number);
function myFunction(viewName: ViewName.BAZ);
function myFunction(viewName: ViewName, fieldValue?: string | number): void {
if (viewName === ViewName.FOO) {
fieldValue = fieldValue.reverse();
}
if (viewName === ViewName.BAR) {
fieldValue *= 2;
}
if (viewName === ViewName.BAZ) {
return console.log('No fieldvalue is supplied by BAZ.');
}
console.log(fieldValue);
}
代码也可以在TypeScript Playground查看。
【问题讨论】:
-
我认为重载只适用于函数的调用者;在里面,它只是你提供的最后一个定义。
-
@jonrsharpe 你是对的:似乎函数重载在你调用它们时起作用(这样就可以有特定的参数组合),但是这种类型的缩小不会传递给函数本身:)
标签: typescript enums overloading