From a652e40a2dbb927a115abc3b40700d0d313a5215 Mon Sep 17 00:00:00 2001 From: Sam Zhou Date: Wed, 4 Nov 2026 07:47:36 -0800 Subject: [PATCH] Make the conversions of `parseInt` and `isNaN` explicit Summary: TypeScript declares `parseInt(string: string, radix?: number)` and `isNaN(number: number)`, and Flow is adopting the same signatures. Calls that pass another type rely on the function's implicit conversion and start to error. Wrap each such argument in `String(...)` (`parseInt`) or `Number(...)` (`isNaN`), the conversion the function already applies, so behavior doesn't change. The calls were found from Flow's errors and rewritten by a codemod. 8 arguments in 6 files in React Native and Metro. Changelog: [Internal] Differential Revision: D129644365 --- .../src/generators/components/CppHelpers.js | 4 ++-- .../Libraries/LogBox/UI/LogBoxInspectorStackFrame.js | 2 +- .../react-native/Libraries/StyleSheet/processTransform.js | 2 +- .../js/examples/SectionList/SectionList-scrollable.js | 2 +- packages/rn-tester/js/examples/XHR/XHRExampleDownload.js | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/react-native-codegen/src/generators/components/CppHelpers.js b/packages/react-native-codegen/src/generators/components/CppHelpers.js index 6a64b2eab3a9..aa352c4b56f4 100644 --- a/packages/react-native-codegen/src/generators/components/CppHelpers.js +++ b/packages/react-native-codegen/src/generators/components/CppHelpers.js @@ -215,7 +215,7 @@ function convertDefaultTypeToString( return String(typeAnnotation.default); case 'DoubleTypeAnnotation': const defaultDoubleVal = typeAnnotation.default; - return parseInt(defaultDoubleVal, 10) === defaultDoubleVal + return parseInt(String(defaultDoubleVal), 10) === defaultDoubleVal ? typeAnnotation.default.toFixed(1) : String(typeAnnotation.default); case 'FloatTypeAnnotation': @@ -223,7 +223,7 @@ function convertDefaultTypeToString( if (defaultFloatVal == null) { return ''; } - return parseInt(defaultFloatVal, 10) === defaultFloatVal + return parseInt(String(defaultFloatVal), 10) === defaultFloatVal ? defaultFloatVal.toFixed(1) : String(typeAnnotation.default); case 'ReservedPropTypeAnnotation': diff --git a/packages/react-native/Libraries/LogBox/UI/LogBoxInspectorStackFrame.js b/packages/react-native/Libraries/LogBox/UI/LogBoxInspectorStackFrame.js index e7b75d9b4f1e..e8eb47de8c12 100644 --- a/packages/react-native/Libraries/LogBox/UI/LogBoxInspectorStackFrame.js +++ b/packages/react-native/Libraries/LogBox/UI/LogBoxInspectorStackFrame.js @@ -25,7 +25,7 @@ component LogBoxInspectorStackFrame( frame: StackFrame, onPress?: ?(event: GestureResponderEvent) => void, ) { - const column = frame.column != null && parseInt(frame.column, 10); + const column = frame.column != null && parseInt(String(frame.column), 10); const location = getFileName(frame.file) + (frame.lineNumber != null diff --git a/packages/react-native/Libraries/StyleSheet/processTransform.js b/packages/react-native/Libraries/StyleSheet/processTransform.js index 6715d05c9d17..565e6aca8bed 100644 --- a/packages/react-native/Libraries/StyleSheet/processTransform.js +++ b/packages/react-native/Libraries/StyleSheet/processTransform.js @@ -152,7 +152,7 @@ const _getKeyAndValueFromCSSTransform: ( }; default: - return {key, value: !isNaN(args) ? Number(args) : args}; + return {key, value: !isNaN(Number(args)) ? Number(args) : args}; } }; diff --git a/packages/rn-tester/js/examples/SectionList/SectionList-scrollable.js b/packages/rn-tester/js/examples/SectionList/SectionList-scrollable.js index 203e6fb5811a..7f1bffdabe43 100644 --- a/packages/rn-tester/js/examples/SectionList/SectionList-scrollable.js +++ b/packages/rn-tester/js/examples/SectionList/SectionList-scrollable.js @@ -205,7 +205,7 @@ export component SectionList_scrollable() { } const setItemPress = (item: Item) => { - if (isNaN(item.key)) { + if (isNaN(Number(item.key))) { return; } const index = Number(item.key); diff --git a/packages/rn-tester/js/examples/XHR/XHRExampleDownload.js b/packages/rn-tester/js/examples/XHR/XHRExampleDownload.js index bf8c6b5e717c..72f6eb283a93 100644 --- a/packages/rn-tester/js/examples/XHR/XHRExampleDownload.js +++ b/packages/rn-tester/js/examples/XHR/XHRExampleDownload.js @@ -60,7 +60,7 @@ class XHRExampleDownload extends React.Component<{...}, any> { const onreadystatechange = () => { if (xhr.readyState === xhr.HEADERS_RECEIVED) { const contentLength = parseInt( - xhr.getResponseHeader('Content-Length'), + String(xhr.getResponseHeader('Content-Length')), 10, ); this.setState({