diff --git a/packages/react-native-codegen/src/CodegenSchema.js b/packages/react-native-codegen/src/CodegenSchema.js index 8033695ba65513..4a16783ef0fff3 100644 --- a/packages/react-native-codegen/src/CodegenSchema.js +++ b/packages/react-native-codegen/src/CodegenSchema.js @@ -53,6 +53,9 @@ export type VoidTypeAnnotation = $ReadOnly<{ export type ObjectTypeAnnotation<+T> = $ReadOnly<{ type: 'ObjectTypeAnnotation', properties: $ReadOnlyArray>, + + // metadata for objects that generated from interfaces + baseTypes?: $ReadOnlyArray, }>; type FunctionTypeAnnotation<+P, +R> = $ReadOnly<{ diff --git a/packages/react-native-codegen/src/parsers/typescript/modules/__tests__/__snapshots__/typescript-module-parser-snapshot-test.js.snap b/packages/react-native-codegen/src/parsers/typescript/modules/__tests__/__snapshots__/typescript-module-parser-snapshot-test.js.snap index d6f4f9d4e3679e..38fd3e1186724a 100644 --- a/packages/react-native-codegen/src/parsers/typescript/modules/__tests__/__snapshots__/typescript-module-parser-snapshot-test.js.snap +++ b/packages/react-native-codegen/src/parsers/typescript/modules/__tests__/__snapshots__/typescript-module-parser-snapshot-test.js.snap @@ -1521,6 +1521,56 @@ exports[`RN Codegen TypeScript Parser can generate fixture NATIVE_MODULE_WITH_NE } ] }, + 'Base1': { + 'type': 'ObjectTypeAnnotation', + 'properties': [ + { + 'name': 'bar1', + 'optional': false, + 'typeAnnotation': { + 'type': 'TypeAliasTypeAnnotation', + 'name': 'Bar' + } + } + ] + }, + 'Base2': { + 'type': 'ObjectTypeAnnotation', + 'properties': [ + { + 'name': 'bar2', + 'optional': false, + 'typeAnnotation': { + 'type': 'TypeAliasTypeAnnotation', + 'name': 'Bar' + } + } + ] + }, + 'Base3': { + 'type': 'ObjectTypeAnnotation', + 'properties': [ + { + 'name': 'bar2', + 'optional': false, + 'typeAnnotation': { + 'type': 'TypeAliasTypeAnnotation', + 'name': 'Bar' + } + }, + { + 'name': 'bar3', + 'optional': false, + 'typeAnnotation': { + 'type': 'TypeAliasTypeAnnotation', + 'name': 'Bar' + } + } + ], + 'baseTypes': [ + 'Base2' + ] + }, 'Foo': { 'type': 'ObjectTypeAnnotation', 'properties': [ @@ -1556,6 +1606,10 @@ exports[`RN Codegen TypeScript Parser can generate fixture NATIVE_MODULE_WITH_NE 'name': 'Bar' } } + ], + 'baseTypes': [ + 'Base1', + 'Base3' ] } }, diff --git a/packages/react-native-codegen/src/parsers/typescript/modules/index.js b/packages/react-native-codegen/src/parsers/typescript/modules/index.js index 1d0a222b48d828..74331eaeb81b8a 100644 --- a/packages/react-native-codegen/src/parsers/typescript/modules/index.js +++ b/packages/react-native-codegen/src/parsers/typescript/modules/index.js @@ -221,7 +221,26 @@ function translateTypeAnnotation( } } case 'TSInterfaceDeclaration': { - const objectTypeAnnotation = { + const baseTypes = (typeAnnotation.extends ?? []).map( + extend => extend.expression.name, + ); + for (const baseType of baseTypes) { + // ensure base types exist and appear in aliasMap + translateTypeAnnotation( + hasteModuleName, + { + type: 'TSTypeReference', + typeName: {type: 'Identifier', name: baseType}, + }, + types, + aliasMap, + tryParse, + cxxOnly, + parser, + ); + } + + let objectTypeAnnotation = { type: 'ObjectTypeAnnotation', // $FlowFixMe[missing-type-arg] properties: (flattenProperties( @@ -246,8 +265,15 @@ function translateTypeAnnotation( }, ) .filter(Boolean), + baseTypes, }; + if (objectTypeAnnotation.baseTypes.length === 0) { + // The flow checker does not allow adding a member after an object literal is created + // so here I do it in a reverse way + delete objectTypeAnnotation.baseTypes; + } + return typeAliasResolution( typeAliasResolutionStatus, objectTypeAnnotation,