Typescript 部分类型推断

Nox*_*Nox 18 type-inference typescript

我对此感到困惑,无法弄清楚如何在没有第二个功能的情况下做到这一点:

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 }
Run Code Online (Sandbox Code Playgroud)

为什么如果我修复类型 A,Typescript 无法推断出 B 的类型?如果我返回一个函数,该函数又尝试推断 B 的类型,那么一切都会再次正常。

Mát*_*osi 21

类型推断基于全有或全无原则。在第一种情况下:

\n
fn({ a: 1 })\n
Run Code Online (Sandbox Code Playgroud)\n

没有提供泛型类型参数,因此它将推断两者:

\n
    \n
  • B{ a: number }将根据函数参数进行推断;
  • \n
  • 并且A将被推断为unknown因为它没有在函数中的任何地方使用。
  • \n
\n

在第二种情况下:

\n
fn<Fixed>({ a: 1 })\n
Run Code Online (Sandbox Code Playgroud)\n

您已指定一种泛型类型,不幸的是,这意味着类型推断将不会用于其余类型参数\xe2\x80\x93 因此:

\n
    \n
  • A被指定为Fixed
  • \n
  • B未给出,因此不会推断它,而是默认为{}.
  • \n
\n

尽管这很烦人,但这就是 TypeScript 的工作原理。您的第二个带有两个函数调用的示例是此问题的常见解决方法。

\n

GitHub 上的相关问题

\n