typescript - 当我为一种类型分配多个具有默认值的泛型时,如何保持泛型类型推断?
问题描述
我定义了一个具有多个泛型的函数,并为它们提供了默认类型。例如:
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]
如何分配一些泛型并保持其余泛型自行推断?
解决方案
我认为这不会出现太多,通常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
推荐阅读
- python - requests.content 正常工作,但在 app.route 烧瓶中使用时会保存损坏的 pdf 文件
- python - 进程线程无法感知全局变量的变化
- apache-flink - 由于 MapR 工件问题,无法从源构建 Flink
- python-3.x - 使用 DICOM 图像进行医学图像处理
- prometheus - 如何使用 Java 使用 http post rest call 将 JSON 数据添加到 prometheus?
- ios - 是否可以将 Firebase 从另一个框架添加到 iOS 项目?
- java - 我做了一个 apk 并在这里给出了这个错误:程序类型已经存在:android.support.v4.provider.DocumentsContractApi19
- redis - redis 排序集分数有大小限制吗?
- php - 我正在尝试运行项目并收到错误 YII 2 ReflectionException Class yii\debug\Module 不存在
- javascript - OBJLoader 和 OrbitControls 中的“THREE.OBJLoader 不是构造函数”和“Unexpected token {”