类型保护实现
function operateByTypeWithTypeGuard(value: string | number | boolean): number | boolean {
if (typeof value ==='string') {
return value.length;
} else if (typeof value === 'number') {
return value * value;
} else {
return!value;
}
}
类型断言实现
function operateByTypeWithTypeAssertion(value: string | number | boolean): number | boolean {
if ((<string>value).length!== undefined) {
return (<string>value).length;
} else if ((<number>value) * (<number>value)!== NaN) {
return (<number>value) * (<number>value);
} else {
return!(<boolean>value);
}
}
优缺点和适用场景
- 类型保护:
- 优点:代码逻辑清晰,可读性强,通过
typeof
等操作符明确判断类型,符合自然的类型检查思维。
- 缺点:需要多个
if - else
分支,对于复杂类型组合可能导致代码冗长。
- 适用场景:当类型判断逻辑较为简单直接,注重代码可读性和维护性时适用。
- 类型断言:
- 优点:代码相对简洁,在一些明确知道类型但编译器无法自动推断的情况下,可以直接告诉编译器类型。
- 缺点:缺乏运行时的类型检查,如果断言错误可能导致运行时错误,降低了代码的健壮性。
- 适用场景:在明确知道类型且编译器类型推断不准确时,为了简化代码使用。但需谨慎使用,避免引入难以排查的错误。