У меня есть переменная.

abc:number|string;

Как узнать его тип? Я хочу сделать что-то вроде ниже:

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

Hongbo Miao

Ответов: 7

Ответы (7)

Для:

abc:number|string;

Используйте оператор JavaScript typeof:

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

TypeScript понимает typeof 🌹

Это называется typeguard.

Подробнее

Для классов вы должны использовать instanceof, например,

class Foo {}
class Bar {} 

// Later
if (fooOrBar instanceof Foo){
  // TypeScript now knows that `fooOrBar` is `Foo`
}

Существуют также ограждения другого типа, напримердюйм и т. Д. https://basarat.gitbooks.io/typescript/content/docs/types/typeGuard.html

Я проверил переменную, является ли она логической или нет, как показано ниже

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

Аналогично

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

и т. Д.

Другие ответы верны, но когда вы имеете дело с интерфейсами, вы не можете использовать typeof или instanceof, потому что интерфейсы не компилируются в javascript.

Вместо этого вы можете использовать typecast + function 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 ((vehicle).ringTheBell) {
        const bike = (vehicle);
        bike.ringTheBell();
    } else {
        const car = (vehicle);
        car.honkTheHorn();
    }
}

А это скомпилированный JavaScript в ES2017:

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

Я хотел бы добавить, что TypeGuards работает только со строками или числами, если вы хотите сравнить объект, используйте instanceof

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

, начиная с Typescript 4.4, вы можете делать как показано ниже:

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

Я подозреваю, что вы можете немного изменить свой подход и использовать что-то вроде приведенного здесь примера:

https://www.typescriptlang.org/docs/handbook/advanced-types.html#userЗащитные ограждения определенного типа

function isFish(pet: Fish | Bird): pet is Fish {
  return (pet as Fish).swim !== undefined;
}

Наберите охранники в машинописном тексте

Чтобы определить тип переменной после условного оператора, вы можете использовать защиту типа. Типовой охранник в машинописном тексте следующий:

Выражение, которое позволяет сузить тип чего-либо внутри условного блока.

Другими словами, это выражение в условном блоке, откуда компилятор машинописного текста имеет достаточно информации, чтобы сузить тип. Тип будет более конкретным в блоке защиты типа, поскольку компилятор вывел дополнительную информацию о типе.

Пример

declare let abc: number | string;

// typeof abc === 'string' is a type guard
if (typeof abc === 'string') {
    // abc: string
    console.log('abc is a string here')
} else {
    // abc: number, only option because the previous type guard removed the option of string
    console.log('abc is a number here')
}

Помимо оператора typeof, существуют встроенные средства защиты типов, такие как instanceof, в, и даже ваши собственные средства защиты типов.

2022 WebDevInsider