使用默认值推断第二种类型

Inferring a second type with a default

我能否定义一个跨两种类型的泛型函数,其中一种类型具有默认值,如果我指定第一种类型,则可以从函数的用法中推断出默认值?

示例:

const f = <T, N extends number = number>(num: N, val: T): [N, T] => [num, val];

const e1 = f(1, "a");         // e1: [1, string]      <- as expected
const e2 = f<string>(1, "b"); // e2: [number, string] <- actual
                              // e2: [1, string]      <- desired

目前不可能。

从 Typescript 4.6.2 开始,您无法部分推断泛型参数。这意味着要么都是从用法中推断出来的,要么都是明确的。

查看此 github 问题:https://github.com/microsoft/TypeScript/issues/10571

本案完全推断:

const e1 = f(1, "a");

这个案例是完全明确的:

const e2 = f<string>(1, "b");

即使您只提供一个参数,这也会将泛型置于显式模式,并搜索该参数的其他显式来源。它在默认类型 N 中找到一个,因此它使用那个。


这里的典型工作是嵌套函数,它可能比您想要的更丑陋:

const fComposed = <N extends number = number>(num: N) => {
    return <T>(val: T): [N, T] => {
        return [num, val]
    }
}

const e3 = fComposed(123)('test') // [123, string]
const e4 = fComposed(123)<string>('test') // [123, string]

Playground


综上所述,这个示例非常人为设计,所以我不知道您的实际用例。但可能有更好的方法完全取决于您的目标。