Typescript возвращает, если значение не определено - PullRequest
1 голос
/ 26 мая 2020

Можно ли в TypeScript вернуть, определено ли значение (т.е. не undefined) таким образом, чтобы транспилятор понимал, что оно не является неопределенным?

Чтобы прояснить мой вопрос, изобразите этот пример :

let myVar: MyClass | undefined = /*something*/

if(myVar) {
    myVar.foo() // this always works, because the transpiler knows that myVar will never be undefined
}

Однако представьте, что myVar необходимо инициализировать перед вызовом foo(). Таким образом, оператор if становится if(myVar && myVar.isInitialized()). Но поскольку эта проверка должна выполняться во многих функциях, я написал функцию isUsable():

function isUsable(myVar: MyClass | undefined): boolean {
    return myVar && myVar.isInitialized();
}

let myVar: MyClass | undefined = /*something*/

if(isUsable(myVar)) {
    myVar.foo() // this does not work, because myVar may be undefined. I would have to use myVar?.foo() or myVar!.foo() which I want to avoid
}

Можно ли определить isUsable() таким образом, чтобы транспилятор понимал, что myVar не может быть неопределенным в if -блоке?

1 Ответ

2 голосов
/ 26 мая 2020

вам нужен тип Guard, myVar is MyClass.

function isUsable(myVar: MyClass | undefined): myVar is MyClass {
    return myVar && myVar.isInitialized();
}

let myVar: MyClass | undefined;

if(isUsable(myVar)) {
    myVar.foo(); // now it works.
}

, так как TS 3.7 вы даже можете его утверждать.

function isUsable(myVar: MyClass | undefined): asserts myVar is MyClass {
  if (!myVar || !myVar.isInitialized()) {
    throw new Error();
  }
}

let myVar: MyClass | undefined;

isUsable(myVar);
myVar.foo(); // now it works.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...