Импортировать файл JSON в декларацию TypeScript (файлы * .d.ts) - PullRequest
1 голос
/ 02 августа 2020

Я пишу файл декларации, который должен объявлять глобальный тип и строго соответствовать определенному c списку строковых фраз. Эти строковые фразы фактически являются частью ключей свойств в объекте, расположенном в файле JSON.

Два вопроса:

  1. Можно ли импортировать файл JSON в файл объявления и обработать его с помощью базовых c функций, например Object.keys и Array.map?
  2. Тем не менее, мне интересно, можно ли вообще использовать JS массив строк для определения типа в TS?

Позвольте мне привести пример кода.

Допустим, у нас есть следующий файл JSON с именем data.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";

Любая помощь или хотя бы руководство приветствуются.

1 Ответ

1 голос
/ 02 августа 2020

Вы можете сделать машинописный вывод о типе из данных в файле json.

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"];

Насколько далеко насколько я знаю, в машинописном тексте нет способа манипулировать строковыми литералами (т.е. удалить #).

См. эти проблемы с github:

...