Хочу сказать, что я нахожусь на уровне новичка как в Typescript, так и в Angular (включая ngrx).

Я пытаюсь понять, как метод select класса Store может принимать строковый литерал в качестве параметра. Вот код:

export interface AppState {
    readonly tutorial: Tutorial[];
}

export class ReadComponent {

  constructor(private store: Store<AppState>) {
    this.tutorials = store.select('tutorial');
  }
}

Теперь я вижу, что у класса AppState есть свойство tutorial, и, похоже, именно для этого и предназначен вызов store.select ('tutorial'), но как? Как так получилось, что если я изменю переданный литерал на select ex. store.select ('yadayada'), компилятор выдает ошибку Аргумент типа '"yadayada"' не может быть назначен параметру типа '"tutorial"' . Как бывают типы "учебник" и "ядяда"? Почему компилятор принимает строковый литерал как тип?

4
Bruno Santos 7 Дек 2018 в 23:49

1 ответ

Лучший ответ

Он определяет его как ключ к типу объекта хранилища и может на основании этого сделать вывод о типе значения. В качестве примера вы можете определить общую функцию:

const getKey = <T>(obj: T, key: keyof T) => obj[key] ;

Он правильно определит тип возвращаемого значения и выдаст ошибку компилятора, если ключ не является ключом T. Вы можете явно ввести возвращаемое значение функции как T [keyof T]. Обобщения машинописного текста и вывод типов безумно мощны.

2
David Sherman 7 Дек 2018 в 23:52