typescript 字符串文本类型的编译时转换

rjee0c15  于 2023-01-21  发布在  TypeScript
关注(0)|答案(1)|浏览(95)

我还不太熟悉TypeScript在幕后是如何工作的,所以我想知道是否有人可以让我知道这是否可行,如果不可行,为什么会这样。
我的目标基本上是使用普通JavaScript函数“生成”类型。显然,你不能将函数应用于类型,所以我开始寻找某种构造来实现类似的结果。

const lower = ['a', 'b', 'c'] as const

/**
 * The goal is to generate a "mapping" type equivalent to { 'a': 'A', 'b': 'B', 'c': 'C' }
 * such that, for example, Upper['a'] => 'A'
 */
type Upper = {
  [c in typeof lower[number]]: c.toUpperCase() // obviously doesn't work
}

我最初试图看看TS是否允许我定义一个“仅编译时函数”,但是什么也没找到;我假设这是编译器执行任意函数的限制。
除了在上面的例子中手工编写Map之外,还有其他的选择吗?如果没有,是什么阻止了TS允许我们定义编译时转换?

jutyujz0

jutyujz01#

虽然不能将普通的JS函数应用于TS类型,但可以应用通用的helper类型,例如Uppercase<>

const lower = ['a', 'b', 'c'] as const

/**
 * The goal is to generate a "mapping" type equivalent to { 'a': 'A', 'b': 'B', 'c': 'C' }
 * such that, for example, Upper['a'] => 'A'
 */
type Upper = {
  [c in typeof lower[number]]: Uppercase<c> // works
}

Playground
in the handbook列出了其他字符串常量通用帮助器。

相关问题