Как динамически набирать компоненты системы ECS в TypeScript? - PullRequest
0 голосов
/ 12 октября 2019

Я программирую типизированную систему ECS. Я хотел бы написать три функции:

  • key регистрирует компонент с его типом и возвращает строку, идентифицирующую компонент.
  • add создает объект. Он принимает объект, определяющий сущность, и учитывает типы, определенные key.
  • get, берет объект с именами компонентов в качестве ключей и функции в качестве тестов и возвращает объекты, удовлетворяющие этим тестам.

Моя проблема здесь заключается только в наборе этих функций. Я могу написать это в JS.

Вот как я хотел бы использовать свои функции:

import { key, add, get } from "./ecs";

const hat = < "red" | "white" >key();
const health = < number >key();

const mario = add( { [ hat ]: "red" } );
mario[ health ] = 0;

const entitiesWithARedHat = get( { [ hat ]: color => color == "red" } );

В конце:

  • mario 'тип s будет { [ hat ]: "red" | "white", [ health ]: number }.
  • * тип 1027 * будет { [ hat ]: string }[]. Я бы содержал mario.

То, что я пробовал до сих пор, потребует key, чтобы где-то хранить типы для add и get для их извлечения:

function get< T, K >( conditions: T ): { [ key in K ]: keyTypeStore[ key ] }[]

Это не работает, потому что тип keyTypeStore является статическим. Создание компонентов во время выполнения не добавит их к типу keyTypeStore.

...