TypeScript:在运行时访问类型信息

标签 typescript typescript-typings typescript-generics

如果根据参数输入创建动态属性:

type ObjBuilder<Prop1 extends string, Prop2 extends string> = {
  [P in Prop1 | Prop2]: P extends Prop2  ? ()=>boolean : ()=>string
}

function objectBuilder<Prop1 extends string, Prop2 extends string>(
  prop1: string,
  prop2: string,
) : ObjBuilder<Prop1, Prop2> {
  return {
    [prop1]: () => true,
    [prop2]: () => prop2,
  } as ObjBuilder<Prop1, Prop2>
}

// note the duplication of information in this code
const a = objectBuilder<'p1', 'p2'>('p1', 'p2')

console.log(a.p1()) // true
console.log(a.p2()) //'p2'

是否可以访问函数定义中的类型定义以避免重复 objectBuilder<'p1', 'p2'>('p1', 'p2')而只有 objectBuilder<'p1', 'p2'>()编译后的 javascript 可以访问字符串 p1p2

换句话说,JavaScript 是否以某种方式通过反射访问类型信息并使其在运行时可用?

code here

最佳答案

您可以推断参数的文字类型。

考虑这个例子:

type ObjBuilder<Prop1 extends string, Prop2 extends string> = {
  [P in Prop1 | Prop2]: P extends Prop2 ? () => boolean : () => string
}

function objectBuilder<Prop1 extends string, Prop2 extends string>(
  prop1: Prop1,
  prop2: Prop2,
): ObjBuilder<Prop1, Prop2> {
  return {
    [prop1]: () => true,
    [prop2]: () => prop2,
  } as ObjBuilder<Prop1, Prop2>
}

const a = objectBuilder('p1', 'p2')
console.log(a.p1())
console.log(a.p2())

Playground

您可能已经注意到,我使用了 Prop1Prop2 泛型作为参数类型,而不是 string。通过这种方式,TS 能够推断文字类型。

如果你对这个主题(函数参数类型推断)感兴趣,你可以查看我的 article

关于TypeScript:在运行时访问类型信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70589489/

相关文章:

typescript - 替换通用接口(interface)类型参数

typescript - 缩小映射函数的泛型类型

typescript - 将对象转换为 KV 值数组

javascript - 模拟日扩展

javascript - 如何识别数据集中的断点(趋势线边缘)?

javascript - 如何立即取消续订?

Typescript:在条件类型中使用元组

node.js - 在注册表中找不到 "dt~mocha"("npm")

typescript - 允许子类使用函数属性或方法覆盖

javascript - Ionic 2 RC0 属性 'tz' 在类型 'typeof moment' 上不存在