Что я могу сделать, чтобы система типов typescript знала тип возвращаемого значения?

#javascript #typescript #function #types #factory-pattern

#javascript #typescript #функция #типы #фабричный шаблон

Вопрос:

Я новичок в typescript, я пытаюсь перенести код so из js в ts во время чтения руководства по ts.

Вот взаимосвязь между разработчиком каждого уровня и пользователем:

разработчик библиотеки -> ProductProvider -> разработчик продукта -> Product -> пользователь продукта -> robot

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

 interface Injection {
    [index: string]: string
}

interface Component {
    id: string,
    install: (injection: Injection) => void
}

interface InitOptions {
    id: string,
    screenType: string,
    SoC: string,
    components: Component[],
}

type Assembler = (injection: object, options: object) => unknown;

type ProductProvider = (initOptions: InitOptions, assembler: Assembler) => (options: object) => ReturnType<typeof assembler>

function ProductProvider(initOptions: InitOptions, assembler: Assembler): (options: object) => ReturnType<typeof assembler> {
    //some work to init
    const installedInjection: Injection = {};
    initOptions.components.forEach((component => component.install(installedInjection)));
    
    return function Product(startOption: object): ReturnType<typeof assembler> {
        return assembler(installedInjection, startOption);
    }
}

export default ProductProvider;

const assembler: Assembler = (injection: object, options: object) => ({ injection, options });

const Product = ProductProvider({
    id: 'XMC9E8DCO5EXEU',
    screenType: 'LCD',
    SoC: 'RX-78',
    components: [{
        id: 'component1',
        install(injection) {
            //some work
            const content = 'whatever';
            injection[this.id] = content;
        } 
    }]
 }, assembler);

const robot = Product({ battery: 'A' });
 

В type Assembler , потому что пользователь ProductProvider свободен в том, как собирать, поэтому я думаю, что тип функции вернет unknown .

Но на самом деле разработчик продукта знает, что параметр assembly, переданный ProductProvider , возвращает значение, и его тип — object .

И другие разработчики продуктов могут также возвращать другой интерфейс или тип.

Что я могу сделать, чтобы система типов typescript знала тип возвращаемого значения? И тогда мы можем наслаждаться intellisense.

XD

Ответ №1:

 type Assembler<T> = (injection: object, options: object) => T;

type ProductProvider<T> = (initOptions: InitOptions, assembler: Assembler<T>) => (options: object) => T;
 

Выполнено.

введите описание изображения здесь