我想写这样一个工厂函数(它返回一个函数),它接受1-2个泛型类型(R
和P
,P
是可选的):
- 如果它得到1个泛型类型,则返回一个形状为
() => R
的函数. - 如果值为2,则返回一个形状为
(p: P) => R
的函数.
type MapLike = Record<string, any>;
function createSomeFn<R extends MapLike>(
key: string,
): () => R;
function createSomeFn<R extends MapLike, P extends MapLike>(
key: string,
): (param: P) => R;
我该怎么做呢?我觉得这是一个函数重载的问题.
我try 了以下方法,当它接受2种类型时有效,但只接受1种类型失败.
type MapLike = Record<string, any>;
function createSomeFn<R extends MapLike, P extends MapLike = never>(
key: string,
) {
return function (p: P): R {
return doSomeThing(key, p);
}
};
-
对于两种类型,它都是有效的
type Pe = { foo: string }; type Re = { bar: string }; const myFn = createSomeFn<Re, Pe>('myFn'); // ✅ It alerts me that there should be a `p` argument // myFn(); // ^^^^^^ error TS2554: Expected 1 arguments, but got 0 myFn({ foo: 'bar' });
-
如果类型为1,则失败
type Re = { bar: string }; const myFn = createSomeFn<Re>('myFn'); // ❌ It should let me go, but raise error // myFn(); // ^^^^^^ error TS2554: Expected 1 arguments, but got 0 // myFn({}); // ^^^^^^^^ error TS2345: Argument of type '{}' is not assignable to parameter of type 'never'