Спасибо @cartant в комментариях. Я отвечаю на этот вопрос сам, так как он не опубликовал свой комментарий в качестве ответа.
Чтобы ввести тип типа члена класса, вы можете использовать несколько методов:
-
Доступ к прототипу:
App.prototype.states
-
Доступ к нему с помощью индексатора
App["states"]
Важно отметить, что этот и описанный выше методы могут не работать, когда член является приватным или статическим.
-
Полиморфный этот тип
Все, что есть в Javascript, имеет «этот тип» в машинописном тексте. Этот «этот» тип можно запросить, как и любой другой тип индекса.
this["states"]
Примечание. У вас могут возникнуть проблемы при использовании этого метода при попытке вызвать функцию в другом контексте. Также вы не можете использовать оператор точек! Вместо этого вы должны использовать оператор индекса объекта
Этот тип-запрос очень полезен в сочетании с классовым наследованием
Если бы вы планировали программу Statemachine, например, вы могли бы иметь абстрактный класс «Statemachine» и использовать этот тип-запрос для получения типа свойства в дочернем классе
Это может выглядеть так:
abstract class Statemachine {
/* The typescript compiler won't actually infer "object" but
{
menu: {
login() => void
},
game: {
update() => void
}
}
> In case of the example below!
*/
abstract states: object
getState<K extends keyof this["states"]>(name: K): T[K] {
return this.states[name];
}
}
class Game extends Statemachine {
private states = {
menu: {
login() {
console.log("Menu.login")
}
},
game: {
update() {
console.log("Game.update") }
}
}
}
const game = new Game()
// Compiler error
game.getState("not a key of game.states")
// Works and intellisense for login()
game.getState("menu")
Ссылка: https://www.typescriptlang.org/docs/handbook/advanced-types.html Ищите полиморфное это.
Надеюсь, что код действительно работает Im в отпуске и не имел возможности проверить его ...