我有一个变量。

abc:number|string;

我如何检查它的类型?我想做的事情如下:

if (abc.type === "number") {
    // do something
}

当前回答

其他答案是正确的,但当你处理接口时,你不能使用typeof或instanceof,因为接口不会被编译成javascript。

相反,你可以使用类型转换+函数check typeguard来检查你的变量:

interface Car {
    drive(): void;
    honkTheHorn(): void;
}

interface Bike {
    drive(): void;
    ringTheBell(): void;
}

function start(vehicle: Bike | Car ) {
    vehicle.drive();

    // typecast and check if the function exists
    if ((<Bike>vehicle).ringTheBell) {
        const bike = (<Bike>vehicle);
        bike.ringTheBell();
    } else {
        const car = (<Car>vehicle);
        car.honkTheHorn();
    }
}

这是ES2017中编译后的JavaScript:

function start(vehicle) {
    vehicle.drive();
    if (vehicle.ringTheBell) {
        const bike = vehicle;
        bike.ringTheBell();
    }
    else {
        const car = vehicle;
        car.honkTheHorn();
    }
}

其他回答

因为Typescript 4.4你可以像下面这样做:

function foo(arg: unknown) {
    const argIsString = typeof arg === "string";
    if (argIsString) {
        console.log(arg.toUpperCase());
    }
}

下面是一种方法,如果你的变量类型是一个包含多个对象接口的联合,你想在其中进行决定:

interface A {
  a: number;
}

interface B {
  b: boolean;
}

let x: string | A | B = /* ... */;

if (typeof x === 'string') {
  // x: string
} else if ('a' in x) {
  // x: A
} else if ('b' in x) {
  // x: B
}

如果你想确保你处理了每个选项,你可以添加一个耗尽性检查。一旦你处理了每个选项,TypeScript会注意到这个变量在此时已经没有可能的其他类型了。它通过赋予never类型来表达这一点。

如果我们添加一个最后的else分支,要求变量为never类型,我们将向类型检查器(以及我们自己)证明这个分支永远不会被调用:

// As long as a variable never holds a type it's not supposed to,
// this function will never actually be called.
function exhaustiveCheck(param: never): never {
  throw Error('exhaustiveCheck got called somehow');
}

if (typeof x === 'string') {
  // x: string
} else if ('a' in x) {
  // x: A
} else if ('b' in x) {
  // x: B
} else {
  // x: never
  exhaustiveCheck(x);
}

如果你忘记处理一个case,你会得到一个类型错误:

if (typeof x === 'string') {
  // x: string
} else if ('b' in x) {
  // x: B
} else {
  // x: A
  exhaustiveCheck(x); // TYPE ERROR: Argument of type 'A' is not
                      // assignable to parameter of type 'never'.
}

我想补充的是,TypeGuards只适用于字符串或数字,如果你想比较一个对象使用instanceof

if(task.id instanceof UUID) {
  //foo
}

我检查了一个变量,如果它是布尔或不是如下

console.log(isBoolean(this.myVariable));

类似地,我们有

isNumber(this.myVariable);
isString(this.myvariable);

等等。

其他答案是正确的,但当你处理接口时,你不能使用typeof或instanceof,因为接口不会被编译成javascript。

相反,你可以使用类型转换+函数check typeguard来检查你的变量:

interface Car {
    drive(): void;
    honkTheHorn(): void;
}

interface Bike {
    drive(): void;
    ringTheBell(): void;
}

function start(vehicle: Bike | Car ) {
    vehicle.drive();

    // typecast and check if the function exists
    if ((<Bike>vehicle).ringTheBell) {
        const bike = (<Bike>vehicle);
        bike.ringTheBell();
    } else {
        const car = (<Car>vehicle);
        car.honkTheHorn();
    }
}

这是ES2017中编译后的JavaScript:

function start(vehicle) {
    vehicle.drive();
    if (vehicle.ringTheBell) {
        const bike = vehicle;
        bike.ringTheBell();
    }
    else {
        const car = vehicle;
        car.honkTheHorn();
    }
}