首页 > 解决方案 > 当我为一种类型分配多个具有默认值的泛型时,如何保持泛型类型推断?

问题描述

我定义了一个具有多个泛型的函数,并为它们提供了默认类型。例如:

function fun<A = any, B = any>(a: A, b: B) {
  return [a, b] as const;
}

如果我不为它们分配任何类型,则将正确推断泛型。

let a: number;
let b: string;
const res = fun(a, b);  // [number, string]

但是,如果我将某种类型分配给它们的一部分,其余的泛型将由它们的默认类型推断。

let a: number;
let b: string;
const res = fun<number>(a, b);  // [number, any]

如何分配一些泛型并保持其余泛型自行推断?

游乐场链接

标签: typescriptgenerics

解决方案


我认为这不会出现太多,通常a会有所需的类型,因此没有理由显式提供类型参数。但是在您希望结果与a(可能是超类型)不同的类型的情况下,想到的解决方案是使用as而不是类型参数。

这是一个例子:

type NumList = 42 | 67;

declare let a: NumList;
declare let b: string;
const res1 = fun(a, b);  // [NumList, string]

const res2 = fun(a as number, b);  // [number, string]
//                ^^^^^^^^^^

游乐场链接

一般来说,我尽量避免类型断言,但这实际上是提供类型参数的方式,至少如果类型断言非常无效,它会失败,例如:

declare let a2: string;
const res3 = fun(a2 as number, b);
//               ^^^^^^^^^^^^−−−−−−− error

游乐场链接


推荐阅读