javascript - Generera Joi-schema från Typescript-typer/gränssnitt
Jag vill generera ett Joi-schemaobjekt från Typescript-typer eller interfaces. Vid min första sökning hittade jag några saker som gör motsatsen (genererar Typescript-typer/interfaces från Joi-scheman), och ts-interface-builder + ts-interface-checker som erbjuder viss möjlighet att skapa runtime-checkers baserat på Typescript-typer/interfaces men som fortfarande saknade funktionellt stöd, och en massa komplicerade saker som använder klasser och dekoratörer runt egenskaper/metoder för att åstadkomma detta.
Finns det något där ute för att generera sådana joi-scheman? Eller ett mer moget alternativ för runtime-kontroll av gränssnitt/typer? (Användbart när man hämtar från en databas och säkerställer att svaret från en DB har rätt struktur)
REDIGERA: Jag antar att det finns en ganska bra tråd om den här typen av problem på den här io-ts GitHub-ärenden.
Svar #1
Jag hittade något som fungerar till min belåtenhet för detta: typescript-is.
- Byt ut vilken TypeScript-kompilator du använder mot ttypescript. Istället för att kalla
tsc, kallattsc. - Lägg till följande i
tsconfig.json:
{
"compilerOptions": {
// Rest of ts config options...
"plugins": [
{
"transform": "typescript-is/lib/transform-inline/transformer"
}
]
}
}
$ npm install ttypescript typescript-is- Nu kan du lägga till följande i din kod:
import { is, assertType } from 'typescript-is'
interface SomeInterfaceOrType {
aString: string
}
// To do a simple boolean check, do the following:
const nonConformingObj = { somethingOutOfLeftField: 42 }
const conforms = is<SomeInterfaceOrType>(nonConformingObj) // false
// Or to get better details on what's wrong, do the following
const anotherNonConformer: unknown = { aString: 1337 }
try {
assertType<SomeInterfaceOrType>(anotherNonConformer)
} catch(error) {
console.log(error.message) // logs: "validation failed at anotherNonConformer.aString: expected a string"
}
Vid kompileringstid kommer is<T>() och assertType<T>()-anropen att omvandlas till fungerande körningstidkontroller. Inte nödvändigtvis ett JOI-schema, men ändå ganska häftigt, och definitivt tillräckligt bra för mitt användningsfall.
