Я конвертирую код ES6 в TypeScript и заметил, что у меня есть класс Api, который импортирует объект, содержащий несколько ресурсов API, расширяющих общий класс ApiResource.

Класс Api принимает все ключи и значения, определенные в объекте, и устанавливает их в экземпляре Api.

Так, например, скажем, следующее - это объект, содержащий различные ресурсы:

import Companies from './Resources/Companies';
import Users .   from './Resources/Users';

export default {
    Companies,
    Users
}

// Resources.js

На этом этапе класс Api импортирует Resources и создаст новый экземпляр Api:

import AppResources from './Resoruces';

import Users from './Internal/Users.js';

const internalResources = {
    Users
};

export default class Api
{
    constructor()
    {
        let resources = {...internalResources, ...AppResources};

        for (let key in availableAPIResources) {
            this[key] = new availableAPIResources[key];
        }
    }
    
    ...
}

Теперь, просто создав экземпляр Api, я могу легко получить доступ как к Users, так и Companies:

let api = new Api;
api.Users.get();
api.Companies.get();

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

Что было бы альтернативой моему предыдущему шаблону в TypeScript?

Имейте в виду, что список ресурсов может отличаться, и я не могу узнать его до компиляции (следовательно, динамический).

0
siannone 24 Ноя 2018 в 19:39

1 ответ

Лучший ответ

Прочитав (второй раз) документацию по расширенным типам TypeScript, я понял, что могу просто создать новый тип

type ApiType = {
    [P in keyof (typeof internalResources & typeof AppResources)]
        : (typeof internalResources & typeof AppResources)[P];
};

И используйте его там, где это необходимо.

0
siannone 27 Дек 2018 в 09:05