[BUG][typescript-fetch] Nested oneOf: parent imports instanceOf<Member> that is never emitted (TS2724/TS2305)
Les mainteneurs répondent en général sous 1 jour
@Utkarsh-rwt y travaille déjà.
Depuis le 16/10/2026.
Évaluation
- Difficulté
- 4/5
- Temps estimé
- 3-5 jours
- Accessibilité débutants
- 35/100
- Type d'issue
- Bug
- Clarté
- Plutôt claire
- Activité
- Active
- Stack technique
- java, openapi, typescript
Piste de recherche
The bug sits in the typescript-fetch template modelOneOf.mustache, which imports instanceOf<Member> for each member in oneOfModels even when the member is itself a oneOf. Start by reproducing with the spec in the issue, then compare the generated Parent.ts imports with the instanceOf functions Child.ts actually exports. Done means the generated client type-checks under strict mode, either by emitting instanceOfChild for discriminated oneOf models or by skipping the import when the function is absent.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Description
Bug Report Checklist
- Have you provided a full/minimal spec to reproduce the issue?
- Have you validated the input using an OpenAPI validator?
- Have you tested with the latest master to confirm the issue still exists?
- Have you searched for related issues/PRs?
- What's the actual output vs expected output?
Description
When a oneOf schema has a member that is itself a oneOf (nested discriminated unions), the generated parent model does not compile. modelOneOf.mustache imports instanceOf<Member> for every member in oneOfModels, but for a member that is a oneOf model the generator never emits that function: only modelGeneric (and modelEnum) define instanceOf<Name>.
models/Parent.ts(18,5): error TS2305: Module '"./Child"' has no exported member 'instanceOfChild'.
With a discriminator the imported function is not even used by the parent (FromJSONTyped / ToJSON switch on the discriminator), so the build breaks only because of the import.
Related but different: #14611 (same missing import, with an enum member instead of a oneOf member).
openapi-generator version
Reproduced with v7.12.0, v7.16.0, v7.23.0, v7.26.0 and latest (7.27.0-SNAPSHOT). Not a recent regression as far as we can tell.
OpenAPI declaration file content or url
openapi: 3.0.0
info:
title: nested oneOf
version: 1.0.0
paths: {}
components:
schemas:
Parent:
oneOf:
- $ref: '#/components/schemas/Leaf'
- $ref: '#/components/schemas/Child'
discriminator:
propertyName: type
mapping:
LEAF: '#/components/schemas/Leaf'
CHILD: '#/components/schemas/Child'
Child:
oneOf:
- $ref: '#/components/schemas/ChildA'
- $ref: '#/components/schemas/ChildB'
discriminator:
propertyName: subType
mapping:
A: '#/components/schemas/ChildA'
B: '#/components/schemas/ChildB'
Leaf:
type: object
required: [type]
properties:
type: { type: string, enum: [LEAF] }
ChildA:
type: object
required: [type, subType]
properties:
type: { type: string, enum: [CHILD] }
subType: { type: string, enum: [A] }
ChildB:
type: object
required: [type, subType]
properties:
type: { type: string, enum: [CHILD] }
subType: { type: string, enum: [B] }
Generation Details
docker run --rm -v "$PWD":/x openapitools/openapi-generator-cli:latest generate \
-i /x/spec.yaml -g typescript-fetch -o /x/out
npx -p [email protected] tsc --noEmit --strict --target es2020 --module commonjs \
--moduleResolution node --lib es2020,dom out/models/Parent.ts
Steps to reproduce
- Generate with the spec and command above.
- Type-check
out/models/Parent.ts: TS2305 oninstanceOfChild.
Expected: the client compiles. Actual: Child.ts exports Child, ChildFromJSON, ChildFromJSONTyped, ChildToJSON, ChildToJSONTyped, but no instanceOfChild.
Suggest a fix
Either of these, in typescript-fetch/modelOneOf.mustache:
-
emit
instanceOf{{classname}}foroneOfmodels with a discriminator, dispatching on the discriminator to the members'instanceOffunctions. This is what we use today as a template override, and it works for us:{{#discriminator}} export function instanceOf{{classname}}(value: object): value is {{classname}} { if (!value || typeof value !== 'object' || !('{{discriminator.propertyBaseName}}' in value)) { return false; } switch ((value as any)['{{discriminator.propertyBaseName}}']) { {{#discriminator.mappedModels}} case '{{mappingName}}': return instanceOf{{modelName}}(value); {{/discriminator.mappedModels}} default: return false; } } {{/discriminator}} -
or not import
instanceOf<Member>when it is not used (the discriminator path) or does not exist (member is aoneOf/enum, which would also cover #14611).
- Langage dominant
- Java
- Étoiles
- 26.9k
- Forks
- 7.8k
- Merge moyen
- 2 j 10 h
- PR mergées (30 j)
- 180
Préparer son environnement
Lance le conteneur de développement du projet dans votre navigateur, avec votre propre compte GitHub.
- Fournit un Dockerfile ou un fichier Docker Compose
- Propose un modèle de pull request
- Lire le guide de contribution
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Autres issues de OpenAPITools/openapi-generator
-
Issue: Bug
Difficulté 2/5 1-3 heures Accessibilité débutants 80/100
OpenAPITools/openapi-generator#25643 · 1 commentaire ·
Les mainteneurs répondent en général sous 1 jour
-
Difficulté 2/5 1-3 heures Accessibilité débutants 82/100
OpenAPITools/openapi-generator#25640 ·
Les mainteneurs répondent en général sous 1 jour
-
[BUG][JAVA] Deprecated properties only get @Deprecated on the getter (base, feign, native, microprofile)Peut-être pris @Inf1mum l’a pris il y a 2 jours. OuverteIssue: Bug
Difficulté 2/5 1-3 heures Accessibilité débutants 82/100
OpenAPITools/openapi-generator#25567 ·
Les mainteneurs répondent en général sous 1 jour
-
[BUG][KOTLIN-SERVER] typeInfoAnnotation.mustache uses As.PROPERTY → discriminator property serialized twicePeut-être pris @Inf1mum l’a pris il y a 9 jours. OuverteIssue: Bug
Difficulté 2/5 1-3 heures Accessibilité débutants 62/100
OpenAPITools/openapi-generator#25524 · 1 commentaire ·
Les mainteneurs répondent en général sous 1 jour
-
[REQ][JAVA][resteasy] Support for Jackson 3 / useJackson3Peut-être pris Une pull request liée à cette issue est ouverte ou déjà fusionnée. OuverteEnhancement: Feature
Difficulté 2/5 1-3 heures Accessibilité débutants 78/100
OpenAPITools/openapi-generator#25364 ·
Les mainteneurs répondent en général sous 1 jour
Toutes les issues de OpenAPITools/openapi-generator
Issues similaires
-
bug emitter:client:csharp
Difficulté 2/5 1-3 heures Accessibilité débutants 84/100
microsoft/typespec#12572 · 1 commentaire · 1 réaction ·
Les mainteneurs répondent en général sous 1 jour
-
GCC 15.2: -Wcast-qual warning - cast discards const qualifier from pointer target type (H5trace.c)Ouverte
Difficulté 2/5 1-3 heures Accessibilité débutants 73/100
Les mainteneurs répondent en général sous 1 jour
-
[Bug] RemotingHelper.connect swaps the socket send and receive buffer configurationPeut-être pris @amalsaidov l’a pris aujourd’hui. Ouverte
Difficulté 2/5 1-3 heures Accessibilité débutants 82/100
Les mainteneurs répondent en général sous 1 jour
-
needs-area-label
Difficulté 2/5 1-3 heures Accessibilité débutants 78/100
Les mainteneurs répondent en général sous 2 jours
-
area/ai area/backend component/zeebe kind/task
Difficulté 2/5 1-3 heures Accessibilité débutants 68/100
Les mainteneurs répondent en général sous 1 jour