TypeScript 中的类型保护是执行运行时检查的一种方式,并保证在某个特定的作用域中变量属于某种确定的类型。以下是一些常见的方法来触发 TypeScript 的类型保护机制:
**typeof**
类型保护:
这是检查基本类型的最简单方法。if (typeof someVar === "string") {
// 在这个作用域里,someVar 的类型为 string
}
**instanceof**
类型保护:
当你有一个类层次结构,并想检查某个实例是否属于某个类时,可以使用它。 ```typescript class Car { drive() { console.log(‘Driving a car’); } }
class Boat { sail() { console.log(‘Sailing a boat’); } }
function move(vehicle: Car | Boat) { if (vehicle instanceof Car) { vehicle.drive(); // vehicle 在这里明确为 Car 类型 } else { vehicle.sail(); // vehicle 在这里明确为 Boat 类型 } }
3. **用户定义的类型保护**:<br />这允许你创建一个函数,该函数的返回类型是一个类型谓词,用于明确某个变量的类型。
```typescript
function isFish(pet: Fish | Bird): pet is Fish {
return (pet as Fish).swim !== undefined;
}
- 字面量类型保护:
使用联合类型时,可以通过比较字面量值来区分类型。 ```typescript type Action = { type: ‘click’ } | { type: ‘hover’ };
function performAction(action: Action) { if (action.type === ‘click’) { // action 在这里是 { type: ‘click’ } 类型 } else { // action 在这里是 { type: ‘hover’ } 类型 } }
5. `**in**`**关键字类型保护**:<br />使用 `in` 关键字可以检查对象中是否存在某个属性,并据此缩小类型。
```typescript
function doStuff(input: string | string[]) {
if ('length' in input) {
// input 在这里是 string[] 类型
} else {
// input 在这里是 string 类型
}
}
- 非空类型保护:
使用!
后缀或使用条件语句来排除null
和undefined
。function printLength(str: string | null) {
if (str) {
console.log(str.length); // str 在这里是 string 类型
}
}
- 断言类型保护:
通过类型断言来明确某个变量的类型,但它不进行实际的运行时检查。const someValue: unknown = "this is a string";
const length: number = (someValue as string).length;
这些是触发 TypeScript 类型保护的常见方法,但随着 TypeScript 的发展,可能会添加更多的特性和方法。