Доступ к статическим методам класса объекта в Typescript? - PullRequest
1 голос
/ 29 октября 2019
class Base {
  static f(){console.log('Base')}
}

class A extends Base {
  static f(){console.log('A')}
}

class B extends Base {
  static f(){console.log('B')}
}

let obj: A|B = new A()

obj.<what to put here>.f()

Я не знаю точный класс для obj, мне нужно напечатать A или просто вызвать f() для правильного класса obj.

Мне не нужно просто имя класса,это например. Я делаю более сложные вещи.

prototype, typeof, constructor все, похоже, синтаксические ошибки.

1 Ответ

1 голос
/ 29 октября 2019

Оба Object.getPrototypeOf () (замена на устаревшие Object.prototype.__proto__) или Object.prototype.constructor должны работать:

Object.getPrototypeOf(obj).constructor.f();

obj.constructor.f();

На самом деле:

Object.getPrototypeOf(obj).constructor === obj.constructor; // true

Здесь вы можете увидеть скомпилированный источник в действии:

class Base {
  static f() { console.log('Base'); }
}

class A extends Base {
  static f() { console.log('A'); }
}

class B extends Base {
  static f() { console.log('B'); }
}

const objBase = new Base();
const objA = new A();
const objB = new B();

Object.getPrototypeOf(objBase).constructor.f();
objBase.constructor.f();

Object.getPrototypeOf(objA).constructor.f();
objA.constructor.f();

Object.getPrototypeOf(objB).constructor.f();
objB.constructor.f();

console.log(Object.getPrototypeOf(objB).constructor === objB.constructor);
console.log(Object.getPrototypeOf(objB) === B.prototype);
.as-console-wrapper {
  max-height: none !important;
}

Обратите внимание, что статические свойства существуют в классах, но не в экземплярах.

Поэтому, если вы хотите перейти от obj к его прототипу,вам следует вызывать Object.getPrototypeOf(obj), а не obj.prototype, что является совершенно другой вещью.

Свойство .prototype существует только в функциях и при создании нового объекта с использованием new и обращении к нему. Функция конструктора (new A()) станет прототипом вновь созданного объекта (устарела .__proto__).

В вашем примере:

obj.prototype;                // undefined
A;                            // class A { static f() { ... } }
A.protoype;                   // { constructor: class A { ... } }
A.protoype.constructor;       // class A { static f() { ... } }
A.protoype.constructor === A; // true
obj.constructor;              // class A { static f() { ... } }
obj.constructor === A;        // true

Object.getPrototypeOf(obj) === A.prototype; // true
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...