-
Notifications
You must be signed in to change notification settings - Fork 25.1k
Description
Description
In this PR:
support was added in codegen for specifying generateOptionalProperties: true which should generate optional props as std::optional in the c++ binding.
I tested it and it works well for e.g. string.
However, when tested with Float it never generates the optional condition. The reason seems to be that for Float we pick a default value like 0.0.
E.g. for this prop:
export interface NativeProps extends ViewProps {
animatedHeight?: Float;and adding a comment here:
react-native/packages/react-native-codegen/src/generators/components/GeneratePropsCpp.js
Lines 112 to 120 in ca520ee
| case 'FloatTypeAnnotation': | |
| if ( | |
| prop.optional && | |
| prop.typeAnnotation.default == null && | |
| generateOptionalProperties | |
| ) { | |
| return ` | |
| if ((${prop.name} != oldProps->${prop.name})) { | |
| if (${prop.name}.has_value()) { |
We can see that the float comes with a default value:
{
name: 'animatedHeight',
optional: true,
typeAnnotation: { type: 'FloatTypeAnnotation', default: 0 }
I feel like when specifying generateOptionalProperties: true this is unexpected behaviour.
If i were to specify:
export interface NativeProps extends ViewProps {
animatedHeight?: WithDefault<Float, 0>;i agree that the default would be correct.
This can actually be worked around by specifying:
export interface NativeProps extends ViewProps {
animatedHeight?: WithDefault<Float, null>;I wanted to open this issue to open a discussion whether we should:
a) Add a check in codegen if generateOptionalProperties: true and .default == defaultTypeForType (e.g. 0), so to check for the default value
b) if a property is optional and using generateOptionalProperties never put down a default value, if not explicitly specified (ie. this is a bug in the ts parser) (ie change the change to if (!prop.typeAnnotation.default))
c) Call this fine and do nothing?
Steps to reproduce
Create a simple typescript spec as above and run codegen.
React Native Version
0.83.1
Affected Platforms
Runtime - Android
Output of npx @react-native-community/cli info
System:
OS: macOS 15.7.3
CPU: (14) arm64 Apple M4 Pro
Memory: 159.64 MB / 48.00 GB
Shell:
version: "5.9"
path: /bin/zsh
Binaries:
Node:
version: 22.14.0
path: /nix/store/04fc23dsflkxl4s9p6lkigia1hq3vjp2-nodejs-22.14.0/bin/node
Yarn:
version: 4.9.2
path: /nix/store/04fc23dsflkxl4s9p6lkigia1hq3vjp2-nodejs-22.14.0/bin/yarn
npm:
version: 10.9.2
path: /nix/store/04fc23dsflkxl4s9p6lkigia1hq3vjp2-nodejs-22.14.0/bin/npm
Watchman:
version: 2024.03.11.00
path: /Users/hannogodecke/Documents/discord/.local/bin/watchman
Managers:
CocoaPods:
version: 1.16.2
path: /Users/hannogodecke/.rbenv/shims/pod
SDKs:
iOS SDK:
Platforms:
- DriverKit 25.2
- iOS 26.2
- macOS 26.2
- tvOS 26.2
- visionOS 26.2
- watchOS 26.2
Android SDK:
API Levels:
- "31"
- "34"
- "35"
- "36"
Build Tools:
- 34.0.0
- 35.0.0
- 35.0.1
- 36.0.0
System Images:
- android-35 | Google APIs ARM 64 v8a
- android-35 | Google Play ARM 64 v8a
- android-35 | Pre-Release 16 KB Page Size Google Play ARM 64 v8a
- android-35 | Pre-Release 16 KB Page Size Google APIs ARM 64 v8a
- android-35 | Google APIs ATD ARM 64
- android-36 | Google Play ARM 64 v8a
Android NDK: Not Found
IDEs:
Android Studio: 2025.2 AI-252.25557.131.2521.14432022
Xcode:
version: 26.2/17C52
path: /usr/bin/xcodebuild
Languages:
Java:
version: 17.0.15
path: /Users/hannogodecke/.jenv/shims/javac
Ruby:
version: 3.4.4
path: /Users/hannogodecke/.rbenv/shims/ruby
npmPackages:
"@react-native-community/cli": Not Found
react: Not Found
react-native:
installed: 0.83.1
wanted: "*"
react-native-macos: Not Found
npmGlobalPackages:
"*react-native*": Not Found
Android:
hermesEnabled: Not found
newArchEnabled: Not found
iOS:
hermesEnabled: Not found
newArchEnabled: Not found
Stacktrace or Logs
No logs, this is more of a discussion item
MANDATORY Reproducer
Screenshots and Videos
No response