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.

  1. Byt ut vilken TypeScript-kompilator du använder mot ttypescript. Istället för att kalla tsc, kalla ttsc.
  2. Lägg till följande i tsconfig.json:
{
    "compilerOptions": {
        // Rest of ts config options...
        "plugins": [
            {
                "transform": "typescript-is/lib/transform-inline/transformer"
            }
        ]
    }
}
  1. $ npm install ttypescript typescript-is
  2. 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.

Relaterade artiklar