【问题标题】:Specify only first type argument仅指定第一个类型参数
【发布时间】:2018-10-20 02:08:22
【问题描述】:
function f<T, U>(foo: T, bar: U) {
}

f(1, "x"); // OK, inferes <number, string>
f<number>(1, "x"); // ERROR: Expected 2 type arguments, but got 1.

我怎样才能只传递第一个类型参数,让 TypeScript 推断另一个?

【问题讨论】:

标签: typescript


【解决方案1】:

正如@Joe-Clay 所说,您可以设置默认参数以使泛型成为可选,但编译器会以您想要的方式not infer them

我使用的一种解决方法是将函数拆分为多个函数(通过currying),每个函数都有一个通用参数。例如:

function f<T,U>(foo:T, bar: U): [T, U] {
  return [foo, bar];
}

变成

function curriedF<T>(foo: T) {
    return function <U>(bar: U): [T, U] {
        return [foo, bar]
    }
}

允许这样做:

var z = curriedF(1)("x"); // [number, string]
var z = curriedF<number>(1)("x"); // also [number, string]

希望有所帮助;祝你好运。


2018 年 10 月 19 日更新

在部分推理方面取得了一些进展(使用* sigil 来标记“请为我推断”)并且它可能存在于 TypeScript 3.2 左右。请参阅this pull request 了解更多信息。

【讨论】:

  • 首先我们向 JavaScript 添加类型,然后我们添加 currying,在你知道之前,我们已经欺骗了每个人使用 OCaml 并且一切都很好:p
  • 你是在告诉我,我在不知不觉中一直在骂人。每次我尝试阅读它的定义时,它都会从一只耳朵进入另一只耳朵。
【解决方案2】:

TypeScript 不提供类型参数的部分推断——要么你明确定义它们,要么让编译器处理它。

但是,您可以为类型参数设置默认值:

function f<T, U = any>(foo: T, bar: U) {

}

f<number>(1, "x");

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2023-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-21
  • 1970-01-01
  • 2019-11-25
  • 1970-01-01
相关资源
最近更新 更多