【问题标题】:Typescript mapping keys to uppercase打字稿将键映射到大写
【发布时间】:2020-03-19 17:49:21
【问题描述】:

我有以下对象:

const foo = {
  fieldAnt: "foo",
  fieldCab: "baz"
};

我想自动将其映射到一个类型,其中键为大写并带有下划线:

type FIELDS = {
  FIELD_ANT: "fieldAnt",
  FIELD_CAB: "fieldCab" 
}

是否可以使用keyof 或类型映射通过 typescript 以编程方式实现这一点?

【问题讨论】:

  • 我不这么认为...请问为什么这会有用?
  • Typescript 只提供类型,你有点问它实际上会影响和改变对象。
  • 不幸的是,您不能使用 typescript 类型进行字符串操作,因此您可以强制 FIELDS 值等于 keyof foo。您无法自己创建所需的大写下划线键。
  • 这个想法是我会运行一个函数来在运行时实际创建该对象,但需要存在用于静态检查的类型

标签: typescript


【解决方案1】:

有点晚了:P 但是,有了little help,我可以做到:

const foo = {
  fieldAnt: "foo",
  fieldCab: "baz"
};

type CamelToSnakeCase<S extends string> =
  S extends `${infer T}${infer U}` ?
  `${T extends Capitalize<T> ? "_" : ""}${Lowercase<T>}${CamelToSnakeCase<U>}` :
  S

type Convert<T> = { [P in keyof T as Uppercase<CamelToSnakeCase<string & P>>]: P }

type Fields = Convert<typeof foo>
// type Fields = {
//  FIELD_ANT: "fieldAnt",
//  FIELD_CAB: "fieldCab" 
// }

TS Playground

【讨论】:

    猜你喜欢
    • 2020-10-16
    • 2020-09-16
    • 2018-11-22
    • 2019-11-19
    • 1970-01-01
    • 2019-06-03
    • 2018-06-18
    • 2020-12-07
    • 2021-01-09
    相关资源
    最近更新 更多