【发布时间】:2021-03-18 16:38:00
【问题描述】:
我想要一个返回对象的函数。该函数还可以将n个函数作为args,并在返回之前使用它们来修改对象。我的问题是在进行更改后我没有得到正确的打字稿类型。
在这个例子中,我有主函数getUser 和两个修饰函数modStatus、modAge。当我使用两个修饰符调用getUser 时,我想将UserModStatus & UserModAge & User 作为返回类型
type User = {
name: string;
};
type UserModAge = {
age: number;
};
type UserModStatus = {
status: "single" | "married";
};
type Mod<EXTRA> = <BASE>(user: BASE) => EXTRA & BASE;
const getUser = <T>(...mods: Mod<T>[]) => {
const user: User = {
name: "John",
};
return mods.reduce((acc, mod) => mod(acc), user);
};
const modAge: Mod<UserModAge> = (user) => {
return { ...user, age: 21 };
};
const modStatus: Mod<UserModStatus> = (user) => {
return { ...user, status: "married" };
};
const res = getUser(modStatus, modAge); // const res: User
但是返回类型只是初始的“用户”类型。
如果我使用静态参数,它可以正常工作
const getUser = <T, V>(mod1: Mod<T>, mod2: Mod<V>) => {
const user: User = {
name: "John",
};
return mod1(mod2(user));
};
const res = getUser(modStatus, modAge); // const res: UserModStatus & UserModAge & User
但我需要它们是动态的。有没有办法做到这一点?
期望的结果是在应用不同的修饰符时得到正确的类型
const res = getUser();
// const res: User
const res = getUser(modAge);
// const res: UserModAge & User
const res = getUser(modStatus);
// const res: UserModStatus & User
const res = getUser(modStatus, modAge);
// const res: UserModStatus & UserModAge & User
【问题讨论】:
-
请提供更多预期行为示例。对我来说有点不清楚
-
这个描述不是很清楚。请尝试解释您正在尝试做什么。有关如何编写好问题的更多信息,请参阅stackoverflow.com/help/how-to-ask
标签: typescript typescript-generics