Typescript Generi c показывает значения объекта как неизвестные - PullRequest
0 голосов
/ 17 апреля 2020

В настоящее время я пытаюсь абстрагировать несколько классов в один, который использует обобщенные типы Класс предназначен в качестве интерфейса для получения и установки свойств с правильной безопасностью типов.

Именно так я собираюсь использовать написанный мной класс. Как описано в комментариях, функция сеттера работает как шарм и правильно определяет тип значения в зависимости от имени атрибута. Однако, когда я вызываю функцию получения, все значения имеют тип неизвестный

(logi c моего кода работает нормально, только ввод не работает)

const textXyz = new XyzInterface(propertyIndexToStructuredObjMap);

textXyz.setProperty(attributeName, value); // This works fine

// This shows the type of props as: {'settings.xyzType': unknown, isInterfaceOn: unknown, isSquareAspectRatio: unknown}
textXyz.getProperties().then(props => {})

Это реализация класса:

export class XyzInterface<XyzProperties> {
    constructor(private propertyIndexToStructureObjMap: { [index in keyof XyzProperties]: number }) {

    }

    async getProperties() {
        const propsString = await new Promise<string>(resolve => {
            evalScript(`new AbCore().getXyzProperties()`, resolve);
        });

        //return {} as XyzProperties; // this not work either, returns unknown for the values as well
        const props: any[] = JSON.parse(propsString);

         return Object.entries(this.propertyIndexToStructureObjMap)
             .reduce((obj, [namedIndex, arrayIndex]) => Object.assign(obj, { [namedIndex]: props[arrayIndex as any] }), {} as XyzProperties);

    }

    async setProperty<T extends keyof XyzProperties>(attribute: T, value: XyzProperties[T]) {
        const index = this.propertyIndexToStructureObjMap[attribute];

        await new Promise<string>(resolve => {
            evalScript(`new AbCore().setXyzProperty(${index}, ${value})`, resolve);
        });

    }
}

Это одно из нескольких возможных специфических c значений, которые я намерен использовать для XyzProperties

export interface TextXyzProperties {
    'settings.yyzType': boolean,
    isInterfaceOn: boolean;
    isSquareAspectRatio: boolean;
}

export const propertyIndexToStructuredObjMap: { [index in keyof TextXyzProperties]: number } = {
    'settings.xyzType': 0,
    isInterfaceOn: 2,
    isSquareAspectRatio: 3,
}

Значения в возвращенном объекте из функция получения должна иметь правильные свойства в соответствии, например, с TextXyzProperties.

Возможно ли добиться этого или мне нужно создать не универсальный c класс для каждого интерфейса WhwhatXyzProperties для достижения правильной типизации?

...