Преобразование данных различных типов и передача их в общий класс c - PullRequest
0 голосов
/ 19 февраля 2020

Во-первых, я должен отметить, что мне не разрешено иметь поля типа any , и во всех методах должен быть указан возвращаемый тип, и не более одного возвращаемого типа.

Я загружаю различные активы из файла JSON в разные компоненты. «Компонент» - это абстрактный класс, от которого наследуются другие классы. Каждый компонент содержит поля различных типов, например, положение: Vector2 и вращение: число.

export default class Transform extends Component {
  private _position!: Vector2;
  private _rotation!: number;
}

. Мне бы хотелось, чтобы каждый компонент запрашивал обобщенный c объект IRawData (из моей AssetLibrary), а затем извлекал необходимые данные из IRawData.

Я создал интерфейс IRawData:

export interface IRawData{
    Convert<T>(): T
}

И тогда мои компоненты получат доступ к карте в AssetLibrary:

componentData: Map<string, IRawData>;

А вот класс NumberData, дополняющий IRawData

export class NumberData implements IRawData{
    public dataNumber!: number;

    constructor(dataNumber: number){
        this.dataNumber = dataNumber;
    }
    Convert<T>(): T
    {
        let raw = this.dataNumber;
        return raw;
    };
}

При попытке присвоить this.dataNumber для raw я получаю сообщения об ошибках:

Тип 'номер' нельзя назначить типу 'T'.

'число' присваивается ограничению типа 'T', но экземпляр 'T' может быть создан с другим подтипом ограничения '{}'

Я хочу немедленно передать каждый новый актив из JSON в объект IRawData, поэтому я передаю число в конструкторе. Идея заключалась в том, что компоненты затем просто вызывали бы метод Convert (): T из объекта IRawData, который они получили из AssetLibrary, чтобы получить свои данные.

Я хотел бы знать, правильно ли я подхожу к этой проблеме. Существует ли определенный шаблон проектирования c, который можно использовать для передачи объектов, которые возвращают неопределенный тип, без использования типа any .

...