Как проверить isDefined правильно в Typescript2 - PullRequest
0 голосов
/ 30 августа 2018

Я хочу создать функцию, которая проверяет, является ли переменная null или undefined.

То, что я хочу - это безопасный тип переменной после проверки.

В моем последнем проекте я сделал следующее:

function isDefined<T>(value: T): value is T {
  return <T>value !== undefined && <T>value !== null;
}

Но почему-то это не работает в моем текущем проекте, возможно, из-за другого tsconfig - я вижу ряд ошибок, таких как "variable может быть null" после isDefined(foo) (проекты используют одинаковые версии машинописи - "2.7.2" )

Я также видел другой подход, который работает, но ... немного странный в терминах или типах.

function isDefined(value: any): value is {} | string | number | boolean {
  return value !== undefined && value !== null;
}

Вопрос: Как создать isDefined, который бы сохранял тип переменной?


UPD1 : Пример использования:

const foo: string | undefined = 'foo';

function getFoo(foo: String): void { 
  console.log(foo);
}

function getBar(foo: string | undefined) {
  if (isDefined(foo)) {
    getFoo(foo); // getFoo still think that foo maight be undefined
  }
}

export function isDefined<T>(value: T): value is T {
  return <T>value !== undefined && <T>value !== null;
}

1 Ответ

0 голосов
/ 30 августа 2018

Хорошо, я нашел решение, которое работает и достаточно дружественное к типам:

Т.Л., др

function isDefined<T>(value: T | undefined | null): value is T {
  return <T>value !== undefined && <T>value !== null;
}

Почему?

Таким образом isDefined() будет учитывать тип переменной, и следующий код будет знать, принять эту проверку во внимание.

Пример 1 - базовая проверка:

function getFoo(foo: string): void { 
  //
}

function getBar(bar: string| undefined) {   
  getFoo(bar); //ERROR: "bar" can be undefined
  if (isDefined(bar)) {
    getFoo(bar); // Ok now, typescript knows that "bar' is defined
  }
}

Пример 2 - уважение типов:

function getFoo(foo: string): void { 
  //
}

function getBar(bar: number | undefined) {
  getFoo(bar); // ERROR: "number | undefined" is not assignable to "string"
  if (isDefined(bar)) {
    getFoo(bar); // ERROR: "number" is not assignable to "string", but it's ok - we know it's number
  }
}
...