Я пытаюсь создать класс Map
, содержащий сопоставление, которое будет установлено другими классами (например, CharacterManager
.
Поскольку содержимое принадлежит другим классам, я хочу, чтобы Map
возьмите универсальный, который всегда будет расширяться object
.
Например:
// Map.ts
interface MapCellData {
collides: boolean;
}
class Map<CellData extends object = {}> {
map!: Array<Array<CellData & MapCellData>>;
}
// CharacterManager.ts
interface CharacterManagerCellData {
character: null | Character;
}
// And so on...
Глядя на тип Array<Array<CellData & MapCellData>>
, вы можете видеть, что я хочу каждую ячейку моего 2D-массивачтобы все свойства определялись всеми другими классами.
Однако проблема в том, что теперь я должен предоставить эти свойства при первом заполнении map
.
Это не удовлетворяет моим потребностямЯ не хочу, чтобы мой класс Map
знал о том, что другие классы хотят добавить. Каждый класс должен отвечать за заполнение своих данных (а Map
отвечает за инициализацию map
в первый раз, чтобы другиеможет считать его доступным.)
Решение кажется мне довольно простым: поскольку свойства CellData
не задаются при первом заполнении карты, я должен сказать, что они являются необязательными. И когда классхочет тебяПохоже, нужно проверить, установлен он или нет.
Исходя из этого, я изменил Array<Array<CellData & MapCellData>>
на Array<Array<Partial<CellData & MapCellData>>>
. (Только что добавил Partial
).
Теперь о реальной проблеме: это не работает, но нет информации об ошибке, я понятия не имею, что я сделал не так.
TypeScript просто заявляет Type '{ collides: true; }' is not assignable to type 'Partial<CellData & MapCellData>'.
Вот полный пример, который выдает ошибку:
interface CharacterManagerCellData {
character: null | string;
}
interface CollisionCellData {
collides: boolean;
}
// Directly using partial without generic works fine
type BasicCellData = Partial<CharacterManagerCellData & CollisionCellData>;
const myCell: BasicCellData = {
collides: true
}
// Using the same pattern with a generic throws a typescript error
function myFunc<CellData extends object = {}>() {
type RealCellData = Partial<CellData & CollisionCellData>;
const cell: RealCellData = {
collides: true
}
}
Я использую последнюю версию TypeScript (3.6.3), и эта ошибка также возникает на детской площадке