【发布时间】:2021-04-03 21:16:16
【问题描述】:
以下代码运行正常。
function test<T extends object, K extends keyof T, P extends (v: T[K]) => any>(
item: T,
key: K,
transform: P
): ReturnType<P> {
return transform(item[key])
}
但是当我将默认函数设置为参数transform 时会出错
function test<T extends object, K extends keyof T, P extends (v: T[K]) => any>(
item: T,
key: K,
transform: P = v => v
): ReturnType<P> {
return transform(item[key])
}
类型 '(v: T[K]) => T[K]' 不能分配给类型 'P'。 '(v: T[K]) => T[K]' 可分配给'P' 类型的约束,但'P' 可以用不同的约束子类型'(v: T[K]) = > 任何'。
如何修改此代码以使用默认方法v => v正常运行它
【问题讨论】:
-
为什么泛型类型是整个函数,而不是它的返回值:
function test<T, K extends keyof T, R>(item: T, key: K, transform: (T[K]) => R = v => v): R。 -
至少one of these 应该回答你的问题。基本上,这就是错误所说的:可以调用
test,这样v => v不是transform的有效实现。您必须使transform的v参数的类型及其返回类型相同。 -
@jonrsharpe 我用
function test<T extends object, K extends keyof T, R>(item: T,key: K,transform: (v: T[K]) => R = v => v): R试过,错误是Type 'T[K]' is not assignable to type 'R'Typescript 试图让 T[K] = R
标签: javascript typescript types constraints