Importer JSON-fil i TypeScript-deklaration (*.d.ts-filer)


Jeg skriver en deklarationsfil, som skal erklære en global type og stramme sig til en specifik liste af strengfraser.
Disse strengfraser er faktisk en del af ejendomstaster i et objekt, der findes i en JSON-fil.

To spørgsmål:

  1. Er det muligt at importere en JSON-fil til en deklarationsfil og behandle den ved hjælp af grundlæggende funktioner, som Object.keys og Array.map?
  2. Alligevel undrer jeg mig over, om det overhovedet er muligt at bruge en JS-array af strenge til at definere en type i TS?

Lad mig give dig et kodeeksempel.

Lad os sige, at vi har følgende JSON-fil med navnet data.json:

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

Nu vil jeg oprette den følgende declarationsfil global.d.ts:

import data from './data.json';

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

Grundlæggende har jeg brug for, at typen defineres (dynamisk, når JSON-filen ændrer sig) sådan her:

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

Enhver hjælp eller i det mindste vejledning vil blive værdsat.

Svar #1

REDIGER: Du kan nu bruge template string literals til at udlede delstreng, der starter fra et givet tegn, på denne måde:

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"

Du kan få TypeScript til at udlede en type fra data i en JSON-fil.

import data from "./data.json";


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

Den resulterende d.ts-fil ser sådan ud:

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

Så vidt jeg ved, er der ingen måde at manipulere strengliteraler i TypeScript på (dvs. fjerne #).

Se de GitHub-problemer:

  • https://github.com/microsoft/TypeScript/issues/12940
  • https://github.com/microsoft/TypeScript/issues/12754

Relaterede artikler