演示地址:https://tsplay.dev/N9De8w
要求:根据提供的参数推断返回的类型(已实现)
问题:
- 第二个参数类型是:
Fn<D, any> | undefined
- 我本意是可以不传这个参数
- 但不传这个参数,拿到的结果就是
any
怎么才能让第二个参数不传也能得到结果
示例代码:
function tableSubmit <
T extends FormInstance<any>,
D extends DataFormType<T>,
F extends Fn<D, any> | undefined,
P extends FilterFormat<F, D>
>(
form: T, filter?: F
): P {
const params: D = form.get();
const data = filter !== undefined ? filter(params) : params;
return data;
}
interface FormInstance<T> {
data: T
get: () => T;
}
type Fn<D, T extends any> = (data: D) => T
type DataFormType<T> = T extends FormInstance<infer U> ? U : T
type FilterFormat<F, D> = F extends (data: D) => infer P ? P : D
const nameData = { name: "levi" };
const formName: FormInstance<{ name: string }> = {
data: nameData,
get: () => nameData
};
const ageData = { age: 18 };
const formAge: FormInstance<{ age: number }> = {
data: ageData,
get: () => ageData
};
const dataName = tableSubmit(formName, data => ({ ...data, site: 'sh' }));
const dataAge = tableSubmit(formAge, undefined);
// remove undenfind args is any
const dataError = tableSubmit(formAge);
知道怎么做了
(推荐)方法 1:重载 https://tsplay.dev/w6D0Em
方法 2:类型推导 https://tsplay.dev/WPQG5w
推荐用重载,非重载会把
void
改造成undefined