【发布时间】:2021-08-06 20:43:54
【问题描述】:
出于演示目的,请考虑以下类型:
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 超集中以某种方式将参数(通用)类型作为参数(参数)传递给另一种类型?
类似于高阶函数,但针对类型。
【问题讨论】:
-
TS 不支持更高种类的类型。 AFAIK Flow.js 确实
-
我可能会为此更改为 Flow,让我将问题更改为也包括 Flow @captain-yossarian
-
虽然您可以将类型构造函数作为泛型传递给类型实用程序flow.org/en/docs/types/utilities/#toc-objmap flowjs 不支持模板文字字符串
-
@captain-yossarian,嗯,它似乎对我不起作用:
type Test<N, F> = F<N>,错误是Cannot apply type because it is not a polymorphic type. [nonpolymorphic-type-app] -
你需要使用objectmap util type
标签: typescript flowtype typescript-generics higher-kinded-types higher-order-types