Я программирую типизированную систему 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
.