typescript - 将参数类型作为类型参数传递给 TypeScript 或 Flow 中的另一种类型
问题描述
出于演示目的,请考虑以下类型:
type ToEnglish<A extends string> =
A extends "1" ? "one" :
A extends "2" ? "two" :
A extends "3" ? "three" :
"etc";
type Convert<A extends string> =
A extends `${infer C}${infer Tail}` ?
`${ToEnglish<C>}-${Convert<Tail>}` : "";
例如,Convert<"12">
结果为"one-two-"
.
现在我想让它更通用,并接受上面的“翻译器”ToEnglish
作为参数:
type Convert2<A extends string, Translator> =
A extends `${infer C}${infer Tail}` ?
`${Translator<C>}-${Convert<Tail>}` : "";
这不起作用:Type 'Translator' is not generic. ts(2315)
如果我尝试写:
type Convert3<A extends string, Translator<_>> =
我得到:',' expected. ts(1005)
在<_>
.
问:有没有办法在 TypeScript、Flow 或另一个 JavaScript 超集中以某种方式将参数(通用)类型作为参数(参数)传递给另一种类型?
类似于高阶函数,但针对类型。
解决方案
我建议一个解决方案,绕过必须直接将泛型类型作为类型参数传递。例如,通过使用本质上是翻译者的记录,您可以改为传递给定翻译者的名称并访问类型:
type ToEnglish<A extends string> =
A extends "1" ? "one" :
A extends "2" ? "two" :
A extends "3" ? "three" :
"etc";
type ToSpanish<A extends string> =
A extends "1" ? "uno" :
A extends "2" ? "dos" :
A extends "3" ? "tres" :
"etc";
type TranslatorMap<A extends string> = {
English: ToEnglish<A>;
Spanish: ToSpanish<A>;
}
type ConvertGeneric<A extends string, Translator extends keyof TranslatorMap<A>> =
A extends `${infer C}${infer Tail}` ?
`${TranslatorMap<C>[Translator]}-${ConvertGeneric<Tail, Translator>}` : "";
type EnglishTest = ConvertGeneric<"12", "English">
type SpanishTest = ConvertGeneric<"12", "Spanish">
推荐阅读
- php - 如何在php中生成二维码和可下载链接
- deep-learning - 输入神经元数量的标准是什么
- html - 如何将网格中的元素从右向左移动
- elasticsearch - Logstash 模糊端口定义
- php - 如果更新时间超过 2 小时,如何使用 PHP 存储获取的 JSON 数据并更新它?
- flutter - 错误:无法在字段初始化程序中访问“this”以读取“_endeks”
- reactjs - React - 如何正确导入本地 UMD 模块
- mysql - 在 Mysql 中为复合主键添加索引
- javascript - 未捕获的类型错误:无法读取未定义的属性“事务”
- csv - 在 Vim 中的给定字符之后隐藏行的一部分