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);
}