Есть ли способ добиться сужения типа путем проверки с помощью функции?

class A {}
class B extends A {
  bb() { ... }
}

function isB(obj: A) {
  return obj instanceof B;
}

const x: A = new B(); // x has type A
if (isB(x)) {
  x.bb(); // can I get x to have type B?
}

Я знаю, что если у меня есть x instanceof B в состоянии это будет работать. Но могу ли я сделать это через isB()?

1 ответ

Решение

Typescript поддерживает это с помощью специального возвращаемого типа, X is A, Вы можете прочитать об этом подробнее в их разделе, посвященном определенным пользователем типам защиты.

Для вашего примера вы можете напечатать это так:

class A {}
class B extends A {
  bb() { ... }
}

function isB(obj: A): obj is B { // <-- note the return type here
  return obj instanceof B;
}

const x: A = new B(); // x has type A
if (isB(x)) {
  x.bb(); // x is now narrowed to type B
}
Другие вопросы по тегам