如何解决打字稿部分类型推断
对此我感到困惑,并且没有第二个功能就无法弄清楚该怎么做:
interface Fixed { a: number }
const fn = <A,B extends {} = {}>(b: B) => {
return b
}
fn({ a: 1 }) // { a: number }
fn<Fixed>({ a: 1 }) // {}
const fn2 = <A>() => <B extends {} = {}>(b: B) => {
return b
}
const result = fn2<Fixed>()({ a: 1 }) // { a: number }
如果我修复A型,为什么Typescript不能推断B型? 如果我返回的函数又试图推断B的类型,那么一切都会再次起作用。
解决方法
类型推断基于全有或全无原则进行。在第一种情况下:
Sharepoint
没有提供泛型类型参数,因此它将同时推断出这两种情况:
-
fn({ a: 1 })
将根据函数参数推断为B
; - 和
{ a: number }
将被推断为A
,因为在函数的任何地方都没有使用它。
在第二种情况下:
unknown
您已指定一种通用类型,但是不幸的是,这意味着类型推断将不会用于其余的类型参数 –因此:
-
fn<Fixed>({ a: 1 })
被指定为A
; -
Fixed
未给出,因此将其默认为B
,而不是对其进行推断。
令人讨厌的是TypeScript的工作方式。第二个带有两个函数调用的示例是解决此问题的常用方法。
与GitHub上的issue相关。
,我相信柯里化是解决方案。只是一个一般的例子:
const x = <I>(v: I) => <O>((v: I) => O) => O
// fully typed
x<number>(10)<string>((n) => `${n * 2}`);
// partial inference NO.1
x(10)<string>((n) => `${n * 2}`);
// partial inference NO.2
x<number>(10)((n) => `${n * 2}`);
// full inference
x(10)((n) => `${n * 2}`);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。