Estoy usando el paquete NPM: https://www.npmjs.com/package/quicktype-core para generar interfaces TypeScript a partir de muestras JSON.
Aquí hay un ejemplo simple del código que genera las interfaces:
const sample_object = { prop_a: 'value A', prop_b: 'value B', }; const jsonInput = jsonInputForTargetLanguage('typescript'); await jsonInput.addSource({ name: 'MyNewInterface', samples: [JSON.stringify(sample_object)], }); const inputData = new InputData(); inputData.addInput(jsonInput); const result = await quicktype({ inputData, lang: 'typescript', inferDateTimes: false, alphabetizeProperties: true, inferEnums: false, rendererOptions: {}, }); // Display generated interface: const generated_code = result.lines.join('\n'); console.log(generated_code);La interfaz que genera funciona al analizar nuevos datos que SOLO contienen las propiedades que conoce. Pero si intenta analizar algunos datos que contienen campos/propiedades adicionales, arroja una excepción, por ejemplo, datos de muestra:
const sample_object = { prop_a: 'value A', prop_b: 'value B', new_extra_property: 'value for new_extra_property', };Lanzará una excepción:
Invalid value "value for new_extra_property" for type false¿Cómo puedo configurar quicktype-core para generar código que NO generará excepciones cuando los datos contengan campos desconocidos adicionales?
Intenté rastrear el código fuente de tipo rápido y encontré un par de rendererOptions llamadas runtimeTypecheckIgnoreUnknownProperties additionalProperties pero tratar de establecerlas como verdaderas o como una cadena no hace ninguna diferencia en el código que genera.
Establecer en verdadero (en realidad da errores de TypeScript para el código, aunque muchas opciones renderizadas de opción de tipo rápido son en realidad bools, y han funcionado para otras configuraciones):
const result = await quicktype({ inputData, lang: 'typescript', inferDateTimes: false, alphabetizeProperties: true, inferEnums: false, rendererOptions: { additionalProperties: true, runtimeTypecheckIgnoreUnknownProperties: true, }, });Establecer una cadena (mantiene el control de TypeScript feliz):
const result = await quicktype({ inputData, lang: 'typescript', inferDateTimes: false, alphabetizeProperties: true, inferEnums: false, rendererOptions: { additionalProperties: 'string', runtimeTypecheckIgnoreUnknownProperties: 'string', }, });