【发布时间】:2020-06-16 05:32:48
【问题描述】:
我有一个合并功能,可以合并特定路径的对象。
const merge = (src, path, newObj) => {
// this code works fine
}
要使用这个函数,我这样称呼它:
interface IUser {
user: {
address: {
street: string
}
}
}
interface IAddrNum {
door: number
}
const User: IUser = {
user: {
address: {
street: "New Street"
}
}
}
const mergeObj: IAddrNum = {
door: 59
}
const newObj = merge(User, "user.address", mergeObj);
这样,我得到了正确的结果。
{
user: {
address: {
street: "New Street"
door: 59
}
}
}
问题:我想在 typescript 中为这个函数创建一个签名。
interface Immutable {
merge<T, K, M>(
src: T,
path: K,
merge: M
): T & M // <== this is where the problem is
}
这没有按预期工作。它不能是T & K,因为合并必须发生在特定路径上。是否有可能拥有此功能的签名?如果是这样,你能给我一些方向吗?谢谢。
【问题讨论】:
-
你不能用
"user.address"来做,因为编译器不能在类型级别解析字符串。相反,您甚至需要使用["user", "address"] as const形式的元组之类的东西才能开始编写它。或者您可以将merge参数设为自己的对象,例如{user: { address: {door: 59}}},而根本不提及路径(在这种情况下,返回类型看起来确实有点像T & M)。我很乐意就这些选项中的任何一个提供建议,但点路径字符串文字不是首发。 -
谢谢@jcalz。我不确定
"user.address"是否有效。谢谢你的解释。我可以做到["user","address"]。如果您能指导我进行这项新更改,那就太好了。
标签: javascript typescript typescript-generics