Skip to content

typeof 类型守卫

typeof 类型守卫(type guard)是 TypeScript 中的一种类型保护机制,用于在运行时检查变量的类型,以便在类型范围内执行相应的操作。这有助于避免类型错误,并使代码更安全和可读。

基本用法

typeof 类型守卫用于检查基本类型(如 stringnumberboolean 等)。它的语法是 typeof variable === 'type'

typescript
function printValue(value: string | number) {
    if (typeof value === 'string') {
        // 在这个代码块中,TypeScript 知道 value 是 string 类型
        console.log(`String value: ${value.toUpperCase()}`);
    } else {
        // 在这个代码块中,TypeScript 知道 value 是 number 类型
        console.log(`Number value: ${value.toFixed(2)}`);
    }
}

printValue('hello'); // 输出: String value: HELLO
printValue(123.456); // 输出: Number value: 123.46

使用场景

  1. 处理联合类型:在处理联合类型时,typeof 类型守卫可以帮助你根据实际类型执行不同的逻辑。
  2. 函数重载:当一个函数有多个重载签名时,typeof 类型守卫可以帮助你确定实际参数类型,从而执行相应的操作。
  3. 代码安全性:通过类型检查,避免运行时类型错误,提升代码的安全性和稳定性。

例子

以下是一些 typeof 类型守卫的常见示例:

检查字符串类型

typescript
function isString(value: any): boolean {
    return typeof value === 'string';
}

console.log(isString('hello')); // 输出: true
console.log(isString(123));     // 输出: false

检查数字类型

typescript
function isNumber(value: any): boolean {
    return typeof value === 'number';
}

console.log(isNumber('hello')); // 输出: false
console.log(isNumber(123));     // 输出: true

处理联合类型中的不同类型

typescript
type User = {
    id: number;
    name: string;
};

function processInput(input: string | number | User) {
    if (typeof input === 'string') {
        console.log(`Received a string: ${input}`);
    } else if (typeof input === 'number') {
        console.log(`Received a number: ${input}`);
    } else {
        console.log(`Received a user: ${input.name}`);
    }
}

processInput('hello'); // 输出: Received a string: hello
processInput(123);     // 输出: Received a number: 123
processInput({ id: 1, name: 'John' }); // 输出: Received a user: John

类型守卫的局限性

typeof 类型守卫只能检查基本类型,对于对象类型或复杂类型(如接口、类等)需要使用其他类型守卫,如 instanceof 或用户自定义类型守卫。

typescript
class Animal {
    name: string;
    constructor(name: string) {
        this.name = name;
    }
}

class Dog extends Animal {
    breed: string;
    constructor(name: string, breed: string) {
        super(name);
        this.breed = breed;
    }
}

function isDog(animal: Animal): animal is Dog {
    return (animal as Dog).breed !== undefined;
}

const myPet: Animal = new Dog('Buddy', 'Golden Retriever');

if (isDog(myPet)) {
    console.log(`Dog breed: ${myPet.breed}`);
} else {
    console.log(`Animal name: ${myPet.name}`);
}

希望这些内容对你理解 typeof 类型守卫有所帮助。如果你有其他问题或需要更多示例,请随时告诉我!

基于 MIT 许可发布