From 043a004ea5c83807c38678a8647b04226d56d976 Mon Sep 17 00:00:00 2001 From: HassanKhan Date: Sat, 31 Oct 2026 12:53:41 +0500 Subject: [PATCH] Keep null in the TypeScript type of Image.resolveAssetSource resolveAssetSource returns null for an asset the registry does not hold, but the generated TypeScript declared `ImageResolvedAssetSource | undefined`: `?T` on an object type member is translated to `T | undefined`. Move the return type to a module-level alias, which translates to `ImageResolvedAssetSource | null | undefined`. Co-Authored-By: Claude Opus 5.5 --- .../Libraries/Image/ImageTypes.flow.js | 7 ++++++- packages/react-native/ReactNativeApi.d.ts | 16 +++++++++------- 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/packages/react-native/Libraries/Image/ImageTypes.flow.js b/packages/react-native/Libraries/Image/ImageTypes.flow.js index 13f1106f66d0..6f468605f5cc 100644 --- a/packages/react-native/Libraries/Image/ImageTypes.flow.js +++ b/packages/react-native/Libraries/Image/ImageTypes.flow.js @@ -25,6 +25,11 @@ export type ImageSize = { export type ImageResolvedAssetSource = ResolvedAssetSource; +// Declared outside the object type below so that the generated TypeScript keeps +// `null`: `?T` on an object member is translated to `T | undefined`, while +// `resolveAssetSource` returns `null` for an asset that isn't registered. +type ResolveAssetSourceResult = ?ImageResolvedAssetSource; + type ImageComponentStaticsIOS = Readonly<{ getSize(uri: string): Promise, getSize( @@ -59,7 +64,7 @@ type ImageComponentStaticsIOS = Readonly<{ /** * @see https://reactnative.dev/docs/image#resolveassetsource */ - resolveAssetSource(source: ImageSource): ?ImageResolvedAssetSource, + resolveAssetSource(source: ImageSource): ResolveAssetSourceResult, }>; type ImageComponentStaticsAndroid = Readonly<{ diff --git a/packages/react-native/ReactNativeApi.d.ts b/packages/react-native/ReactNativeApi.d.ts index c0f8309f0ac5..e1f5d67cc3d8 100644 --- a/packages/react-native/ReactNativeApi.d.ts +++ b/packages/react-native/ReactNativeApi.d.ts @@ -4,7 +4,7 @@ * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * - * @generated SignedSource<> + * @generated SignedSource<> * * This file was generated by scripts/js-api/build-types/index.js. */ @@ -2466,7 +2466,7 @@ declare type ImageComponentStaticsIOS = { queryCache(urls: Array): Promise<{ [url: string]: "disk" | "disk/memory" | "memory" }> - resolveAssetSource(source: ImageSource): ImageResolvedAssetSource | undefined + resolveAssetSource(source: ImageSource): ResolveAssetSourceResult } declare type ImageErrorEvent = NativeSyntheticEvent< Readonly @@ -4116,6 +4116,8 @@ declare type RequiredVirtualizedSectionListProps< sections: ReadonlyArray> } declare type requireNativeComponent = typeof requireNativeComponent +declare type ResolveAssetSourceResult = + ImageResolvedAssetSource | null | undefined declare type ResolvedAssetSource = { readonly height: number | undefined readonly scale: number @@ -5791,7 +5793,7 @@ export { AlertOptions, // 8a116d2a AlertType, // 5ab91217 AndroidKeyboardEvent, // e03becc8 - Animated, // 33fe7464 + Animated, // 89733ea3 AppConfig, // 35c0ca70 AppRegistry, // edec2a30 AppState, // 12012be5 @@ -5856,10 +5858,10 @@ export { IEventEmitter, // fbef6131 IOSKeyboardEvent, // e67bfe3a IgnorePattern, // ec6f6ece - Image, // a24a5777 - ImageBackground, // 1fbbacef - ImageBackgroundInstance, // 9c900a60 - ImageBackgroundProps, // b078f0ac + Image, // de357ba4 + ImageBackground, // fd50fdb6 + ImageBackgroundInstance, // 61ab8daf + ImageBackgroundProps, // 49c3326d ImageErrorEvent, // b6227714 ImageInstance, // df709524 ImageLoadEvent, // 31709c38