From 275da8beb5d4323daa1bc3ca0c1f18e6605c54f7 Mon Sep 17 00:00:00 2001 From: Sam Zhou Date: Mon, 22 Sep 2025 20:41:17 -0700 Subject: [PATCH] Add annotations to fix future natural inference errors in xplat/js: 6/n Summary: Changelog: [Internal] Differential Revision: D83000736 --- flow-typed/environment/node.js | 18 ++--- .../debugger-shell/src/electron/index.flow.js | 4 +- .../src/cli/combine/combine-js-to-schema.js | 2 +- .../scripts/featureflags/print.js | 4 +- .../IntegrationTests/ImageCachePolicyTest.js | 2 +- .../js/examples/Filter/FilterExample.js | 2 +- .../js/examples/Transform/TransformExample.js | 23 +++++- .../__tests__/VirtualizedSectionList-test.js | 74 ++++++++++--------- .../upload-release-assets-for-dotslash.js | 2 +- .../releases/validate-dotslash-artifacts.js | 2 +- .../write-dotslash-release-asset-urls.js | 2 +- 11 files changed, 82 insertions(+), 53 deletions(-) diff --git a/flow-typed/environment/node.js b/flow-typed/environment/node.js index b1494ed66659..eecaceb1f405 100644 --- a/flow-typed/environment/node.js +++ b/flow-typed/environment/node.js @@ -3057,30 +3057,30 @@ type util$InspectOptions = { }; declare type util$ParseArgsOption = - | {| + | $ReadOnly<{| type: 'boolean', multiple?: false, short?: string, default?: boolean, - |} - | {| + |}> + | $ReadOnly<{| type: 'boolean', multiple: true, short?: string, default?: Array, - |} - | {| + |}> + | $ReadOnly<{| type: 'string', multiple?: false, short?: string, default?: string, - |} - | {| + |}> + | $ReadOnly<{| type: 'string', multiple: true, short?: string, default?: Array, - |}; + |}>; type util$ParseArgsOptionToValue = TOption['type'] extends 'boolean' ? TOption['multiple'] extends true @@ -3137,7 +3137,7 @@ declare module 'util' { declare function stripVTControlCharacters(str: string): string; declare function parseArgs< - TOptions: {[string]: util$ParseArgsOption} = {||}, + TOptions: {+[string]: util$ParseArgsOption} = {||}, >(config: {| args?: Array, options?: TOptions, diff --git a/packages/debugger-shell/src/electron/index.flow.js b/packages/debugger-shell/src/electron/index.flow.js index 4ef3b2377f10..cbfe8bf3b3d2 100644 --- a/packages/debugger-shell/src/electron/index.flow.js +++ b/packages/debugger-shell/src/electron/index.flow.js @@ -25,7 +25,9 @@ app.setVersion(pkg.version + '-' + buildInfo.revision); const { values: {version = false}, } = util.parseArgs({ - options: {version: {type: 'boolean'}}, + options: { + version: {type: 'boolean'}, + }, args: process.argv.slice(app.isPackaged ? 1 : 2), strict: false, }); diff --git a/packages/react-native-codegen/src/cli/combine/combine-js-to-schema.js b/packages/react-native-codegen/src/cli/combine/combine-js-to-schema.js index e16d98e64a54..f2cf06241a57 100644 --- a/packages/react-native-codegen/src/cli/combine/combine-js-to-schema.js +++ b/packages/react-native-codegen/src/cli/combine/combine-js-to-schema.js @@ -47,7 +47,7 @@ function combineSchemas( } return merged; }, - {modules: {}}, + {modules: {} /*:: as SchemaType['modules'] */}, ); return { diff --git a/packages/react-native/scripts/featureflags/print.js b/packages/react-native/scripts/featureflags/print.js index 93c569ac0da7..e5b62459d4b0 100644 --- a/packages/react-native/scripts/featureflags/print.js +++ b/packages/react-native/scripts/featureflags/print.js @@ -37,8 +37,8 @@ function getPurposeString(purpose: string): string { } function compareFeatureFlags( - [keyA, valueA]: [string, {Purpose: string, ...}], - [keyB, valueB]: [string, {Purpose: string, ...}], + [keyA, valueA]: $ReadOnly<[string, $ReadOnly<{Purpose: string, ...}>]>, + [keyB, valueB]: $ReadOnly<[string, $ReadOnly<{Purpose: string, ...}>]>, ): number { const purposeA = PURPOSE_ORDER.indexOf(valueA.Purpose); const purposeB = PURPOSE_ORDER.indexOf(valueB.Purpose); diff --git a/packages/rn-tester/IntegrationTests/ImageCachePolicyTest.js b/packages/rn-tester/IntegrationTests/ImageCachePolicyTest.js index e26a4212382b..b5b786d86624 100644 --- a/packages/rn-tester/IntegrationTests/ImageCachePolicyTest.js +++ b/packages/rn-tester/IntegrationTests/ImageCachePolicyTest.js @@ -31,7 +31,7 @@ const {TestModule} = NativeModules; const TESTS = ['only-if-cached', 'default', 'reload', 'force-cache'] as const; function ImageCachePolicyTest(): React.Node { - const [state, setState] = useState({ + const [state, setState] = useState<{[string]: ?boolean}>({ 'only-if-cached': undefined, default: undefined, reload: undefined, diff --git a/packages/rn-tester/js/examples/Filter/FilterExample.js b/packages/rn-tester/js/examples/Filter/FilterExample.js index bd403bc531b0..cb50e3743389 100644 --- a/packages/rn-tester/js/examples/Filter/FilterExample.js +++ b/packages/rn-tester/js/examples/Filter/FilterExample.js @@ -68,7 +68,7 @@ function StaticViewAndImageWithState(props: Props): React.Node { const styles = StyleSheet.create({ blurWithShadow: { - filter: [{blur: 10}], + filter: [{blur: 10 as string | number}], boxShadow: '0 0 10px 10px black', overflow: 'hidden', backgroundColor: 'pink', diff --git a/packages/rn-tester/js/examples/Transform/TransformExample.js b/packages/rn-tester/js/examples/Transform/TransformExample.js index cd6c1b1d020a..c3b1501a9bc7 100644 --- a/packages/rn-tester/js/examples/Transform/TransformExample.js +++ b/packages/rn-tester/js/examples/Transform/TransformExample.js @@ -9,6 +9,7 @@ */ import type {RNTesterModuleExample} from '../../types/RNTesterTypes'; +import type {AnimatedNode} from 'react-native/Libraries/Animated/AnimatedExports'; import * as React from 'react'; import {useEffect, useRef, useState} from 'react'; @@ -226,7 +227,16 @@ const styles = StyleSheet.create({ height: 50, position: 'absolute', top: 0, - transform: [{translate: [200, 350]}, {scale: 2.5}, {rotate: '-0.2rad'}], + transform: [ + { + translate: [200, 350] as [ + number | string | AnimatedNode, + number | string | AnimatedNode, + ], + }, + {scale: 2.5}, + {rotate: '-0.2rad'}, + ], width: 100, }, box5: { @@ -238,7 +248,16 @@ const styles = StyleSheet.create({ width: 50, }, box5Transform: { - transform: [{translate: [-50, 35]}, {rotate: '50deg'}, {scale: 2}], + transform: [ + { + translate: [-50, 35] as [ + number | string | AnimatedNode, + number | string | AnimatedNode, + ], + }, + {rotate: '50deg'}, + {scale: 2}, + ], }, box6: { backgroundColor: 'salmon', diff --git a/packages/virtualized-lists/Lists/__tests__/VirtualizedSectionList-test.js b/packages/virtualized-lists/Lists/__tests__/VirtualizedSectionList-test.js index d5d2b2101a70..cc6b1da8d266 100644 --- a/packages/virtualized-lists/Lists/__tests__/VirtualizedSectionList-test.js +++ b/packages/virtualized-lists/Lists/__tests__/VirtualizedSectionList-test.js @@ -97,14 +97,16 @@ describe('VirtualizedSectionList', () => { ListEmptyComponent={() => } ListFooterComponent={() =>