Typescript - keyof 对象为 'OR strings option'

标签 typescript types casting typescript-generics

我正在导入一个 .json 文件,并且我想获取所有键作为可选参数

import jsonFile from '../public/sample.json'

json 具有未知的键,但是对于这个问题,我们假设它具有以下内容:

{
  "greetings": {
    "hello": "Hello",
        "hello_informal": "Hi",
        "good_morning": "Good morning",
        "good_afternoon": "Good afternoon",
        "good_night": "Good night",
        "bye": "Bye"
  },
  "commons": {
    "pagination": {
            "first_page": "First page",
            "last_page": "Last page",
            "next_page": "Next page",
            "previous_page": "Previous page"
        }
  },
  "home": "Home sweet home"
}

我有一个带有 1 个参数的函数。

function sample(keyValue: TypeKeyValue) {
  // logic here...
  console.log("Thank you Stackoverflow", keyValue)
}

我的问题是如何为所有对象键(包括嵌套键,以带有点的父键作为前缀)的 keyValue 参数创建一个类型。 键的值并不重要,只需收集所有键作为可选即可。

我正在尝试此操作,但没有按预期工作:

type TypeKeyValue: keyof jsonFile 

期望的结果应该是一种自动化的方式来获得以下内容:

type TypeKeyValue: "greetings" | "greetings.hello" | "greetings.hello_informal" | "greetings.good_morning" | "greetings.good_afternoon" | "greetings.good_night" | "greetings | bye" | "commons" | "commons.pagination" | "commons.pagination.first_page" | "commons.pagination.last_page" | "commons.pagination.next_page" | "commons.pagination.previous_page" | "home"

任何帮助或解决方案将不胜感激

最佳答案

只要您的 tsconfig.json 中有以下选项, typescript 就应该自动检测导入的 JSON 文件的类型:

"resolveJsonModule": true,
"esModuleInterop": true,

之后,您可以获取 JSON 对象的所有键,其类型如下:

import jsonFile from '../public/sample.json'

type TypeKeyValue = keyof typeof jsonFile 

如果您还想要所有嵌套路径,则需要执行 something like this :

type Join<K, P> = K extends string | number ?
    P extends string | number ?
    `${K}${"" extends P ? "" : "."}${P}`
    : never : never;


type Prev = [never, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
    11, 12, 13, 14, 15, 16, 17, 18, 19, 20, ...0[]]

type Paths<T, D extends number = 10> = [D] extends [never] ? never : T extends object ?
    { [K in keyof T]-?: K extends string | number ?
        `${K}` | Join<K, Paths<T[K], Prev[D]>>
        : never
    }[keyof T] : ""

type Leaves<T, D extends number = 10> = [D] extends [never] ? never : T extends object ?
    { [K in keyof T]-?: Join<K, Leaves<T[K], Prev[D]>> }[keyof T] : "";

type Nested = Paths<typeof json>

在这种情况下,Nested 将包含该对象的所有路径。

关于Typescript - keyof 对象为 'OR strings option',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71911930/

相关文章:

angular - 如何在 rollup 中导入 stompjs

typescript - 如何扩展字符串文字类型?

javascript - 单击时自动聚焦 ng-multiselect-dropdown 的 Filterfield

android - ((ActivityName) getActivity()).FragmentName.methodInFragment(); - (ActivityName) 在做什么,它是如何工作的?

java - 为什么我不能在 if 语句中强制转换对象?

javascript - Angular Reactive Forms动态嵌套数组检测失去焦点时的变化

Java DefaultMutableTree 不兼容的类型

c++ - 引用类型可以用作 STL 映射中的键类型吗

java - 使用 JDL 声明自己的数据类型

c - 在 C 中转换指针时出错