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:
- Er det muligt at importere en JSON-fil til en deklarationsfil og behandle den ved hjælp af grundlæggende funktioner, som
Object.keysogArray.map? - 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
