相关疑难解决方法(0)

TypeScript 泛型条件类型作为泛型函数的返回值

背景

作为我正在开发的数据分析库的一部分,我正在创建一组从字符串中读取某些类型的值的函数。这个想法本质上是定义 CSV 文件的结构,这样我就可以将其每个单元格作为字符串读取,并且知道它应该是什么类型,然后将该字符串转换为适当类型的值。

有些单元格包含多个值,并被转换为数组。其他单元格包含单个值。

我在这里所做的部分工作是删除与预期不符的值,并记录警告。对于包含数组的单元格,我很高兴结果仍然是一个数组,即使它是空的。但对于包含单个值的单元格,我想将无效值转换为null.

为此,我设置了一个由所有这些“转换器”函数共享的泛型类型,它返回与这些要求匹配的条件类型:

type TransformerFn<T> = (value: string, locationIdentifier?: string) => T extends any[] ? T : (T | null);
Run Code Online (Sandbox Code Playgroud)

在我迄今为止实现的简单情况下,例如将字符串拆分为字符串数组或提取布尔值,这工作得很好。TransformerFn<string[]>TypeScript 在解决or的条件时没​​有问题TransformerFn<boolean>

但我拥有的一个变压器本质上是为了确认列中的每个单元格要么为空,要么包含 string 中的值enum,在这里我遇到了问题。

我一直在输入该字符串枚举,就像Record<string, string>将其用作函数参数时一样,它运行良好。但是,最近我添加了一些功能来重新编码显然应该是特定枚举值但尚未正确加载的数据。

为了实现这一点,我使用了带有约束的泛型类型来表示字符串枚举值的并集:

export function enumValue<E extends string>(enums: Record<string, E>, recodeMap?: Record<string, E>)
Run Code Online (Sandbox Code Playgroud)

这一直工作得很好,直到我尝试添加TransformerFn之前提到的打字。

问题

尽管我的泛型类型E有一个约束 it extends string,这意味着E extends any[]永远不会为真,但 TypeScript 无法解析我的泛型条件类型。

这是它给我的错误:

类型 '(值: 字符串, locationIdentifier?: 字符串 | 未定义) => E | …

typescript typescript-generics conditional-types

7
推荐指数
1
解决办法
6578
查看次数