#javascript #typescript #es6-class
#javascript #typescript #es6-класс
Вопрос:
В TypeScript / Javscript, как мне проверить, расширяет ли класс B класс A
class A {
...
}
class B extends A {
...
}
assert(B extends A) // How to do something like this?
Ответ:
Пара способов сделать это. Спасибо @Daniel и @AviatorX
B.prototype instanceof A // true
Object.getPrototypeOf(B) === A // true
Reflect.getPrototypeOf(B) === A // true
Не уверен, какой самый типичный идиоматический способ сделать это, или если есть какие-либо отсутствующие крайние случаи, но сработал для моего варианта использования
Комментарии:
1. Вы пытаетесь сделать это во время разработки (получаете ошибку во время компиляции, если
B extends A
значение false перед отправкой любого JS вообще) или во время выполнения (с помощью некоторого JS-кода)?2. И говорим ли мы о проверке, включает ли
B
цепочка прототиповA
? Или мы проверяем, думает лиB extends A
система структурных типов TypeScript? Они разные (у вас может быть одно значение true, когда другое значение false)3. вы можете получить имя родительского класса, используя
Object.getPrototypeOf(B).
он вернет объект, из которого вы можете получить информацию о родительском классеB
4. Если принятого ответа достаточно, то этот вопрос действительно касается JavaScript (ES2015 ), а не TypeScript как такового. Рассмотрите возможность изменения тегов.
5. @jcalz Эта проверка типа выполняется во время выполнения, а не компиляции, поэтому спасибо, что различаете два случая. Я внес изменения
Ответ №1:
Вы можете использовать instanceof
, чтобы проверить, является ли прототип конструктора экземпляром A
:
export class A {
}
export class B extends A {
}
console.log(B.prototype instanceof A);
Выводит true
для меня.
Комментарии:
1. B не является объектом, он не был создан. Так что это было бы ложью.
(new B() instanceof A)
однако это было бы правдой, но я не хочу создавать его экземпляр.2. В этом случае соответствие прототипу должно сработать. Я обновил свой ответ