【发布时间】:2020-04-14 17:11:10
【问题描述】:
我想定义一个像这样工作的函数:
const result = evaluate({x: () => 2 * 3, y: () => "hello"})
result 的值是:
{x: 6, y: "hello"}
据我所知,定义必须类似于:
function evaluate<T>(obj: Record<keyof T, () => T[keyof T]>): T {
// Copy the key-value pairs, invoking each value.
// There are a few different ways to do this.
return Object.assign({}, ...Object.entries<() => T[keyof T]>(obj).map(([k, v]) => ({[k]: v()})))
}
但是,这并不完全有效。在前面提供的示例中,result 的类型推断为:
{x: unknown, y: unknown}
如果明确提供类型参数,则函数调用会按预期工作:
const result = evaluate<{x: number, y: string}>({x: () => 2 * 3, y: () => "hello"})
有什么方法可以让类型推断正常工作吗?
【问题讨论】:
-
相关问题似乎是this one,为什么不能从
keyof函数参数类型正确推断出对象文字。我认为,不是属性值类型是{},而是在某个时间点将其更改为unknown作为常见的超类型
标签: typescript generics types type-inference typescript-generics