作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在玩使用 TypeScript 的简单包装函数的想法。我最终得到了一些与以下内容有关的东西:
export function logFn<T extends (...args: any[]) => any>(
fn: T,
): (...args: Parameters<T>) => ReturnType<T> {
const log = (...args: Parameters<T>): ReturnType<T> => {
console.log('log')
return fn(...args)
}
return log
}
export function logFn<T extends (...args: any[]) => any>(
fn: T,
): T {
const log: T = (...args) => {
console.log('log')
return fn(...args)
}
return log
}
log
带有错误的变量声明:
Type '(...args: any[]) => any' is not assignable to type 'T'.
'(...args: any[]) => any' is assignable to the constraint of type 'T', but 'T' could be instantiated with a different subtype of constraint '(...args: any[]) => any'.
最佳答案
“问题”是这样的:T extends (...args: any[]) => any
如果您看到以下版本,它会更加直观:
export function logFn<T extends (...args: any[]) => any>(fn: T): T {
return (a, b) => fn(a, b);
}
Type '(a: any, b: any) => any' is not assignable to type 'T'. '(a: any, b: any) => any' is assignable to the constraint of type 'T', but 'T' could be instantiated with a different subtype of constraint '(...args: any[]) => any'.
T extends (...args: any[]) => any
去
logFn((a, b) => a + b)
logFn((a, b, c) => c)
return (a, b) => fn(a, b);
logFn<T extends (...args: any[]) => any>(fn: T): T
T
并返回一个类型
T
.
return (a, b) => fn(a, b);
是一个有效的返回类型,它确实扩展了
(...args: any[]) => any
但是你怎么能确定传递给
fn
的值? (
T
) 匹配那个签名? (即它可能是
(...args: any[]) => any
的另一个不兼容的子类型)
(...args: Parameters<T>) => ReturnType<T>
您告诉编译器参数和返回类型必须与传递函数的参数和返回类型匹配,而不是
T
可以是任何其他函数定义
关于typescript - 泛型函数子类型约束错误和混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58209952/
我是一名优秀的程序员,十分优秀!