Типы типов запросов в классах

Я пытаюсь получить типы запросов типа type для работы в классах.

Обычно запросы типа работают следующим образом:

const user = { name: "Patrick", age: 17 };
let typeofUser: typeof user;

В приведенном выше примере «typeofUser» будет иметь тип:

{ name: string, age: number }

Все идет нормально. Но я пытаюсь получить запросы типа для работы с классами. Например:

class App {
  states = {
    menu: {
      login() {
        console.log("Menu.login");
      }
    },
    game: {
      update() {
        console.log("Game.update");
      }
    }
  };

  constructor() {
    // FAILS => Cannot find name "states"
    const typeofStates: typeof states = {};

    // FAILS => Cannot find name "states"
    const keyofStates: keyof states = "game";
  }
}

Мой вопрос: как я могу получить доступ к членам класса для запросов типа, истребитель «typeof» или «keyof»?

Образец детской площадки для скрипки

typescript,

0

Ответов: 1


0 принят

Спасибо @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 в отпуске и не имел возможности проверить его ...

машинопись,
Похожие вопросы
Яндекс.Метрика