Skip to content

Commit 593ae02

Browse files
huntiemeta-codesync[bot]
authored andcommitted
Convert additional Props/Style types to interface (#58062)
Summary: In response to this comment: #57490 (comment) The DefinitelyTyped `react-native-web` types augment the `react-native` module to layer web-only props and style values onto React Native's types. Module augmentation only works against `interface` declarations, so these hit `error TS2300: Duplicate identifier`. This was solved in #56809 — this diff extends `interface` emission to additional types as below. **Changes** Annotate the remaining types that `types/react-native-web` augments with `build-types emit-as-interface`: - `AccessibilityProps` - `ImageProps` - `PressableStateCallbackType` - `ViewStyle`, `TextStyle`, `ImageStyle` **Source for matched `types/react-native-web` conflicts** | Type | Declared in | Augmented by `types/react-native-web` | | --- | --- | --- | | `AccessibilityProps` | `Libraries/Components/View/ViewAccessibility.js:342` | [index.d.ts#L1272](https://github.com/DefinitelyTyped/DefinitelyTyped/blob/df17ec34853e80dac955a0c2649cec989d90b2b5/types/react-native-web/index.d.ts#L1272) | | `ImageProps` | `Libraries/Image/ImageProps.js:336` | [index.d.ts#L1422](https://github.com/DefinitelyTyped/DefinitelyTyped/blob/df17ec34853e80dac955a0c2649cec989d90b2b5/types/react-native-web/index.d.ts#L1422) | | `PressableStateCallbackType` | `Libraries/Components/Pressable/Pressable.js:36` | [index.d.ts#L1444](https://github.com/DefinitelyTyped/DefinitelyTyped/blob/df17ec34853e80dac955a0c2649cec989d90b2b5/types/react-native-web/index.d.ts#L1444) | | `ViewStyle` | `Libraries/StyleSheet/StyleSheet.js.flow:141` | [index.d.ts#L1458](https://github.com/DefinitelyTyped/DefinitelyTyped/blob/df17ec34853e80dac955a0c2649cec989d90b2b5/types/react-native-web/index.d.ts#L1458) | | `TextStyle` | `Libraries/StyleSheet/StyleSheet.js.flow:159` | [index.d.ts#L1486](https://github.com/DefinitelyTyped/DefinitelyTyped/blob/df17ec34853e80dac955a0c2649cec989d90b2b5/types/react-native-web/index.d.ts#L1486) | | `ImageStyle` | `Libraries/StyleSheet/StyleSheet.js.flow:177` | [index.d.ts#L1514](https://github.com/DefinitelyTyped/DefinitelyTyped/blob/df17ec34853e80dac955a0c2649cec989d90b2b5/types/react-native-web/index.d.ts#L1514) | **Not fixed** The remaining DT failures (parsed from https://github.com/DefinitelyTyped/DefinitelyTyped/actions/runs/32138113480) aren't interface issues: - `InteractionManager` has no export in the Strict API at all. - `VirtualizedListProps` is genuinely non-generic in the Flow source (`packages/virtualized-lists/Lists/VirtualizedListProps.js:287`), and `getItem` / `getItemCount` are required there. DT's `VirtualizedListProps<ItemT>` with those omitted is an assumption carried over from the old hand-written types. - The `ViewStyle` / `TextStyle` / `ImageStyle` "incorrectly extends `WebStyle`" errors **will persist**. RN's `DimensionValue` includes `null`, and DT redefines `bottom?: CSSProperties["bottom"] | DimensionValue` on an interface extending `WebStyle`, whose `bottom` does not accept `null`. DT needs `Exclude<DimensionValue, null>` there. Expect 3 of the 16 reported errors to remain once the duplicate-identifier ones clear. cc rjbailey Changelog: [General][Fixed] - **JS API**: Additional Props/Style types are now defined as `interface`, fixing compatibility with certain DefinitelyTyped packages Pull Request resolved: #58062 Test Plan: - `node ./scripts/js-api/build-types` — snapshot regenerated; `--validate` passes - `yarn test-generated-typescript`, `yarn test-typescript` — pass - `yarn jest scripts/js-api` — 141 tests pass - Scratch project replaying react-native-web's augmentations against `types_generated`: all six now merge cleanly. As a control, augmenting `ImagePropsAndroid` (still a type alias) in the same harness reproduces `error TS2300: Duplicate identifier`, confirming the harness detects the failure mode. Reviewed By: cipolleschi Differential Revision: D117534044 Pulled By: cortinico fbshipit-source-id: 8fc37375f7a3d9ea86e1a206059d365b38658231
1 parent 4eee1cd commit 593ae02

6 files changed

Lines changed: 103 additions & 97 deletions

File tree

packages/react-native/Libraries/Components/Pressable/Pressable.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ export type PressableInstance = HostInstance;
3232

3333
export type {PressableAndroidRippleConfig};
3434

35+
/** @build-types emit-as-interface react-native-web compatibility */
3536
export type PressableStateCallbackType = Readonly<{
3637
pressed: boolean,
3738
}>;

packages/react-native/Libraries/Components/View/ViewAccessibility.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -349,6 +349,7 @@ export type AccessibilityPropsIOS = Readonly<{
349349
accessibilityRespondsToUserInteraction?: ?boolean,
350350
}>;
351351

352+
/** @build-types emit-as-interface react-native-web compatibility */
352353
export type AccessibilityProps = Readonly<{
353354
...AccessibilityPropsAndroid,
354355
...AccessibilityPropsIOS,

packages/react-native/Libraries/Image/ImageProps.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -327,6 +327,7 @@ export type ImagePropsBase = Readonly<{
327327
children?: empty,
328328
}>;
329329

330+
/** @build-types emit-as-interface react-native-web compatibility */
330331
export type ImageProps = Readonly<{
331332
...ImagePropsIOS,
332333
...ImagePropsAndroid,

packages/react-native/Libraries/StyleSheet/StyleSheet.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,7 @@ export type TypeForStyleKey<
136136
* object of styles to pass to a View that can't be precomputed with
137137
* StyleSheet.create.
138138
*/
139+
/** @build-types emit-as-interface react-native-web compatibility */
139140
export type ViewStyle = ____ViewStyle_Internal;
140141

141142
/**
@@ -153,6 +154,7 @@ export type ViewStyle = ____ViewStyle_Internal;
153154
* object of styles to pass to a Text that can't be precomputed with
154155
* StyleSheet.create.
155156
*/
157+
/** @build-types emit-as-interface react-native-web compatibility */
156158
export type TextStyle = ____TextStyle_Internal;
157159

158160
/**
@@ -170,6 +172,7 @@ export type TextStyle = ____TextStyle_Internal;
170172
* object of styles to pass to an Image that can't be precomputed with
171173
* StyleSheet.create.
172174
*/
175+
/** @build-types emit-as-interface react-native-web compatibility */
173176
export type ImageStyle = ____ImageStyle_Internal;
174177

175178
/**

packages/react-native/Libraries/StyleSheet/StyleSheet.js.flow

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,7 @@ export type TypeForStyleKey<
137137
* object of styles to pass to a View that can't be precomputed with
138138
* StyleSheet.create.
139139
*/
140+
/** @build-types emit-as-interface react-native-web compatibility */
140141
export type ViewStyle = ____ViewStyle_Internal;
141142

142143
/**
@@ -154,6 +155,7 @@ export type ViewStyle = ____ViewStyle_Internal;
154155
* object of styles to pass to a Text that can't be precomputed with
155156
* StyleSheet.create.
156157
*/
158+
/** @build-types emit-as-interface react-native-web compatibility */
157159
export type TextStyle = ____TextStyle_Internal;
158160

159161
/**
@@ -171,6 +173,7 @@ export type TextStyle = ____TextStyle_Internal;
171173
* object of styles to pass to an Image that can't be precomputed with
172174
* StyleSheet.create.
173175
*/
176+
/** @build-types emit-as-interface react-native-web compatibility */
174177
export type ImageStyle = ____ImageStyle_Internal;
175178

176179
/**

0 commit comments

Comments
 (0)