почему нам нужен typeof как интерфейс для получения статических свойств класса в машинописи - PullRequest
0 голосов
/ 14 февраля 2019

Я изучаю официальный справочник машинописи, объясняющий функции конструктора, и наткнулся на следующий код.

class Greeter {
    static standardGreeting = "Hello, there";
    greeting: string;
    greet() {
        if (this.greeting) {
            return "Hello, " + this.greeting;
        }
        else {
            return Greeter.standardGreeting;
        }
    }
}

let greeter1: Greeter;
greeter1 = new Greeter();
console.log(greeter1.greet());

let greeterMaker: typeof Greeter = Greeter;
greeterMaker.standardGreeting = "Hey there!";

let greeter2: Greeter = new greeterMaker();
console.log(greeter2.greet());

Далее поясняется, что при написании

пусть greeterMaker: typeof Greeter = Greeter;

мы можем получить доступ к фактическомукласс со статическими свойствами с использованием typeof Greeter, следовательно, может писать greeterMaker.standardGreeting = "Hey there!";

Мой вопрос: когда я это проверял, я понял, что то же самое будет работать без записи typeof Greeter только с let greeterMaker = Greeter;можно написать greeterMaker.standardGreeting = "Hey there!";

Подскажите, пожалуйста, где я ошибся и когда мне нужно написать ключевое слово typeof.

Ответы [ 2 ]

0 голосов
/ 14 февраля 2019

В этом случае вам не нужно явно использовать typeof Greeter, компилятор выведет этот тип для вас на основе присваивания.Однако typeof Greeter будет по-прежнему иметь тип greeterMaker, даже если вы не указали аннотацию явно.Я думаю, что смысл документа заключается в том, что если вам нужен тип статической части, то типом является typeof Greeter, тогда как Greeter является типом экземпляра.

Примером, где это может быть полезно, являетсяв заводской функции:

class Greeter {
  sayHi() { console.log("Hi") }
}

class AlertGreeter extends Greeter {
  sayHi() { alert("Hi") }
}

function doGreeting(cls: typeof Greeter) {
  new cls().sayHi();
}

doGreeting(Greeter);
doGreeting(AlertGreeter);
0 голосов
/ 14 февраля 2019

Да, вы правы, в этом случае запись :typeof Greeter не требуется, так как при назначении значения Greater для greeterMaker также назначается тип для greeterMarker.Так что я думаю :typeof Greeter это просто объяснение того, как работает Typescript

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...