在TypeScript声明中导入JSON文件(*.d.ts文件)

hfyxw5xn  于 2023-01-10  发布在  TypeScript
关注(0)|答案(1)|浏览(244)

我正在写一个声明文件,它应该声明一个全局类型,并严格到一个特定的字符串短语列表。
这些字符串短语实际上是JSON文件中对象的属性键的一部分。
两个问题:
1.是否可以将JSON文件导入到声明文件中,并使用Object.keysArray.map等基本函数对其进行处理?
1.然而,我想知道,是否有可能使用JS字符串数组来定义TS中的类型?
让我给你一个代码示例。
假设我们有一个名为data.json的JSON文件:

{
  "someList": {
    "#key1": {"a": 1, "b": 2},
    "#key2": "some value",
    "#key3": 1234
  }
}

现在,我想创建以下声明文件global.d.ts

import data from './data.json';

declare global {
  type AllowedKeys = Object(data.someList).map(key => key.substr(1));
}

基本上,我需要定义类型(随着JSON文件的变化而动态地定义),如下所示:

type AllowedKeys = "key1" | "key2" | "key3";

任何帮助或至少指导将不胜感激。

kkbh8khc

kkbh8khc1#

EDIT:现在可以使用模板字符串常量来推断从给定字符开始的子字符串,如下所示:

import data from "./data.json";
export type AllowedKeys = keyof typeof data["someList"] extends `#${infer K extends string}` ? K : never;
// This is equivalent to
// export type AllowedKeys = "key1" | "key2" | "key3"

您可以让typescript从json-file中的数据推断类型。

import data from "./data.json";

export type AllowedKeys = keyof typeof data["someList"];
// This is equivalent to
// export type AllowedKeys = "#key1" | "#key2" | "#key3"

生成的d.ts文件如下所示:

import data from "./data.json";
export declare type AllowedKeys = keyof typeof data["someList"];

据我所知,还没有办法在typescript中操作字符串常量(例如,删除#)。
看看那些github问题:

相关问题