打字稿部分类型推断

时间:2020-08-31 21:17:45

标签: typescript type-inference

对此我感到困惑,并且没有第二个功能就无法弄清楚该怎么做:

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的类型,那么一切都会再次起作用。

2 个答案:

答案 0 :(得分:2)

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

Sharepoint

没有提供泛型类型参数,因此它将同时推断出这两种情况:

  • fn({ a: 1 }) 将根据函数参数推断为B
  • { a: number }将被推断为A,因为在函数的任何地方都没有使用它。

在第二种情况下:

unknown

您已指定一种通用类型,但是不幸的是,这意味着类型推断将不会用于其余的类型参数 –因此:

  • fn<Fixed>({ a: 1 }) 被指定为A;
  • Fixed未给出,因此将其默认为B,而不是对其进行推断。

令人讨厌的是TypeScript的工作方式。第二个带有两个函数调用的示例是解决此问题的常用方法。

与GitHub上的issue相关。

答案 1 :(得分:0)

我相信柯里化是解决方案。只是一个一般的例子:

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}`);