使用默认值推断第二种类型
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]
综上所述,这个示例非常人为设计,所以我不知道您的实际用例。但可能有更好的方法完全取决于您的目标。
我能否定义一个跨两种类型的泛型函数,其中一种类型具有默认值,如果我指定第一种类型,则可以从函数的用法中推断出默认值?
示例:
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]
综上所述,这个示例非常人为设计,所以我不知道您的实际用例。但可能有更好的方法完全取决于您的目标。