Generera explicit gränssnittskod från härledd TypeScript-gränssnitt
Säg att jag har ett kodavsnitt:
const todo = {name: "Learn Some TS", isDone: true}
Hur kan jag automatiskt generera följande:
interface TodoInterface {
name: string
isDone: Boolean
}
Letar efter några verktyg där jag kan få gränssnittet från kodsnuttar. Det behöver inte nödvändigtvis lösa det här exakta scenariot.
Svar #1
I de IDE:er jag använder (VSCode och TypeScript Playground) håller jag markören över värdet vars typ jag vill fånga. Detta visar IntelliSense snabbinfo som beskriver typen, och du kan kopiera och klistra in den.
För
const todo = { name: "Learn Some TS", isDone: true }
Den tillhandahållna informationen ser ut så här
/* const todo: {
name: string;
isDone: boolean;
} */
som kan kopieras, klistras in och ändras för att ge dig
interface TodoInterface {
name: string;
isDone: boolean;
}
Ytterligare skärminspelningsdemo:
Observera att dina kompilatoralternativ kan komma att trunkera långa typer. Till exempel, tänk dig att du har denna typ:
type SomeFiltered<T extends any[]> =
T extends [infer F, ...infer R] ? [F, ...SomeFiltered<R>] | SomeFiltered<R> : []
Den tar en tuppeltyp och producerar en förening av alla möjliga filtrerade versioner av den. Eftersom varje element antingen kan vara närvarande eller frånvarande, förvandlar du en tupel med 𝑛-element till en förening av 2𝑛 tupler. Det är mycket. Alltså detta
type LongType = SomeFiltered<["A", "B", "C", "D", "E"]>
kan förväntas ha 32 fackmedlemmar. Med standardkompilatoralternativ kommer du inte att se hela typen med IntelliSense:
/*
type LongType = [] | ["A", "B", "C", "D", "E"] | ["B", "C", "D", "E"] | ["C", "D", "E"] |
["D", "E"] | ["E"] | ["D"] | ["C"] | ["C", "E"] | ["C", "D"] | ["B"] | ["B", "D", "E"] |
["B", "E"] | ... 18 more ... | [...]
*/
Se ... 18 till ... och [...] trunkeringar.
Du kan inaktivera sådan trunkering genom att aktivera kompilatorflaggan --noErrorTruncation. (Det är ett lite olyckligt namn, eftersom det undertrycker trunkering av visade typenamn överallt, inte bara i felmeddelanden.) Då får du detta:
/* with --noErrorTruncation=true
type LongType = ["A", "B", "C", "D", "E"] | ["B", "C", "D", "E"] | ["C", "D", "E"] |
["D", "E"] | ["E"] | [] | ["D"] | ["C", "E"] | ["C"] | ["C", "D"] | ["B", "D", "E"] |
["B", "E"] | ["B"] | ["B", "D"] | ["B", "C", "E"] | ["B", "C"] | ["B", "C", "D"] |
["A", "C", "D", "E"] | ["A", "D", "E"] | ["A", "E"] | ["A"] | ["A", "D"] |
["A", "C", "E"] | ["A", "C"] | ["A", "C", "D"] | ["A", "B", "D", "E"] |
["A", "B", "E"] | ["A", "B"] | ["A", "B", "D"] | ["A", "B", "C", "E"] |
["A", "B", "C"] | ["A", "B", "C", "D"]
*/
Playground-länk till kod
