#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;
Выполнено.