作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在尝试使用 TypeScript 结合作为参数传递的枚举和类型取决于枚举的第二个参数来实现函数重载时,我遇到了一个小问题。
例如:
FOO
,那么第二个参数是 string
类型 BAR
,那么第二个参数是 number
类型 BAZ
, 没有第二个参数 fieldValue
总是
string | number
.
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 不会根据第一个参数的类型来缩小第二个参数的类型。此功能未在 typescript 中实现。
您可以向 if
添加额外的检查。让编译器缩小 fieldValue
的类型
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 && typeof fieldValue === "string") {
fieldValue = fieldValue.reverse();
}
else if (viewName === ViewName.BAR && typeof fieldValue === 'number') {
fieldValue *= 2;
}
console.log(fieldValue);
}
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 as string).reverse();
}
else if (viewName === ViewName.BAR) {
fieldValue = (fieldValue as number) * 2;
}
console.log(fieldValue);
}
function myFunction(p: { viewName: ViewName.BAZ }
| { viewName: ViewName.BAR, fieldValue: number }
| { viewName: ViewName.FOO, fieldValue: string }): void {
if (p.viewName === ViewName.FOO) {
p.fieldValue = p.fieldValue.reverse();
}
else if (p.viewName === ViewName.BAR) {
p.fieldValue *= 2;
}
console.log(fieldValue);
}
关于使用枚举重载 TypeScript 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53848410/
我是一名优秀的程序员,十分优秀!