TypeScript - сохранение класса в качестве значения карты?

У меня мало занятий. Test~ классы расширяются FrameModel,

Как я могу создать карту из string подклассам FrameModel?

import FrameModel from '../../FrameModel';
import TestShipModel from './TestGeneratorModel';
import TestGeneratorModel from './TestGeneratorModel';
import TestPlanetModel from './TestGeneratorModel';

export class DiscriminatorMappingData
{
    static mapping: { [key: string]: typeof FrameModel } = {
        "TestShip": TestShipModel,
        "TestGenerator": TestGeneratorModel,
        "TestPlanet": TestPlanetModel,
    }
}

Это заканчивается с ошибкой:

DiscriminatorMappingData.ts (8,5): ошибка TS2322: Тип '{ [x: string]: typeof "...' нельзя назначить типу {{key: string]: typeof "...'.
Подписи индекса несовместимы.
Тип typeof "...models/T..." нельзя назначить типу typeof ".../FrameModel".
Свойство FrameModel отсутствует в типе typeof ".../models/T...".

Я предполагаю, что это можно сделать с помощью дженериков, но я не уверен, как это сделать.

2 ответа

Решение

(Со ссылкой на комментарий, вот решение проблемы.)

Проблема, кажется, с import оператор и фигурные скобки должны быть включены при импорте класса. например import {FrameModel}...

Вы можете объявить хеш-таблицу с типом базового класса (FrameModel) и использовать типы-потомки в качестве реальных значений (я упустил модули для простоты):

class FrameModel {
}

class TestShipModel extends FrameModel {
}
class TestGeneratorModel extends FrameModel {
}
class TestPlanetModel extends FrameModel {
}

export class DiscriminatorMappingData
{
    static mapping: { [key: string]: typeof FrameModel } = {
        "TestShip": TestShipModel,
        "TestGenerator": TestGeneratorModel,
        "TestPlanet": TestPlanetModel,
    }
}

Этот код работает для меня на площадке Typescript.

Другие вопросы по тегам