在这里,我想创建一个可以定义其依赖项的函数,这些依赖项在实例化时提供给函数。我无法让 TS 在此处提供正确的类型检查。我得到的错误是:
(parameter) d1: string | number
Argument of type 'string | number' is not assignable to parameter of type 'number'.
Type 'string' is not assignable to type 'number'
如何让 TS 按顺序理解 args 的类型,而不会将它们作为一个 union 混为一谈?
export type Injectable<T = any> = {
dependencies: Injectable[];
get: () => Promise<T | null>;
};
export type AsyncFactoryFn<T, Deps extends any[] = any[]> = (...args: {[K in keyof Deps]: Deps[K] extends Injectable<infer U> ? U : never}) => Promise<T>;
export function injectable<T, Deps extends Injectable<any>[]>(
asyncFactoryFn: AsyncFactoryFn<T, Deps>,
dependencies: Deps = [] as unknown as Deps,
): Injectable<T> {
return {} as Injectable<T>;
}
// EXAMPLE
const dep1 = {
dependencies: [],
get: () => Promise.resolve(1),
}
const dep2 = {
dependencies: [],
get: () => Promise.resolve('a'),
}
const injectableObject = injectable((d1, d2) => Promise.resolve(someService(d1, d2)), [dep1, dep2]);
function someService(d1: number, d2: string) {
console.log(d1, d2);
}