基于Typescript函数泛型类型参数的条件JavaScript生成

vsnjm48y  于 2022-12-30  发布在  TypeScript
关注(0)|答案(1)|浏览(135)

假设我有一个由键和true/false值组成的对象,这些键和值可以打开或关闭日志记录以及一个日志函数

const LoggedKeys = {
  logged: true,
  ignored: false,
}
function log(key, msg) {
  if(LoggedKeys[key]) console.log(msg);
}
log('logged', "This should be logged")
log('ignored', "That should not do anything")

是否可以编写TypeScript版本,使类型为false键在编译期间不生成函数调用或生成空函数?(只是为了保存在LoggedKey为false的情况下多次调用日志函数的性能缺陷)
例如:

interface LoggedKeys {
  logged: true,
  ignored: false,
}
type MyLogFunction<T keyof LoggedKeys> = LoggedKeys[T] extends true? (msg) => void: never
// I have no idea how it would look like 
// and usage could look like
log<logged>("That would generate proper log function")
log<ignored>("That would be erased during compilation or generate fake empty function during compilation")
myzjeezk

myzjeezk1#

TypeScript中存在的任何JavaScript语法也将存在于发出的JavaScript中。

log<logged>("That would generate proper log function")
log<ignored>("That would be erased during compilation or generate fake empty function during compilation")

将 * 必然 * 导致JavaScript

log("That would generate proper log function")
log("That would be erased during compilation or generate fake empty function during compilation")

使用标准的TypeScript是没有办法的,你可以把编译过程看作是做一件事情,主要是;删除TypeScript语法,这样剩下的就是有效的JavaScript了。实际上,没有额外的动态逻辑发生(除了一些奇怪的东西,比如枚举,它们也存在于发出的代码中)。
您必须更改log函数以在JavaScript中实现所需的逻辑,这可能需要传递另一个参数而不是泛型参数。

相关问题