描述
如果用户代码错误地将 null
传递给 finally 块,react-native 将抛出 TypeError: null is not a function
错误。
Node.js 或浏览器都不会在变量被错误地设置为 null 时调用 finally 中的变量。
Node.js
$ node
Welcome to Node.js v20.15.1.
Type ".help" for more information.
> const onPress = async () => Promise.resolve('success').finally(null);
undefined
> await onPress()
'success'
>
Browser
已在 Google Chrome Version 127.0.6533.73 (Official Build) (arm64)
的浏览器控制台中验证
> const onPress = async () => Promise.resolve('success').finally(null);
undefined
> await onPress()
'success'
重现步骤
检查重现器的 README
React Native 版本
0.74.3
受影响的平台
运行时 - iOS
npx react-native info
的输出
System:
OS: macOS 14.5
CPU: (10) arm64 Apple M1 Pro
Memory: 5.92 GB / 32.00 GB
Shell:
version: "5.9"
path: /bin/zsh
Binaries:
Node:
version: 20.15.1
path: ~/.nvm/versions/node/v20.15.1/bin/node
Yarn:
version: 3.6.4
path: ~/.nvm/versions/node/v20.15.1/bin/yarn
npm:
version: 10.7.0
path: ~/.nvm/versions/node/v20.15.1/bin/npm
Watchman:
version: 2024.07.15.00
path: /opt/homebrew/bin/watchman
Managers:
CocoaPods:
version: 1.15.2
path: /opt/homebrew/bin/pod
SDKs:
iOS SDK:
Platforms:
- DriverKit 23.5
- iOS 17.5
- macOS 14.5
- tvOS 17.5
- visionOS 1.2
- watchOS 10.5
Android SDK:
API Levels:
- "31"
- "33"
- "34"
- "35"
Build Tools:
- 30.0.3
- 31.0.0
- 33.0.0
- 33.0.1
- 34.0.0
- 35.0.0
System Images:
- android-35 | Google Play ARM 64 v8a
Android NDK: Not Found
IDEs:
Android Studio: 2024.1 AI-241.18034.62.2411.12071903
Xcode:
version: 15.4/15F31d
path: /usr/bin/xcodebuild
Languages:
Java:
version: 1.8.0_422
path: /usr/bin/javac
Ruby:
version: 3.3.4
path: /Users/trivikr/.rvm/rubies/ruby-3.3.4/bin/ruby
npmPackages:
"@react-native-community/cli": Not Found
react:
installed: 18.2.0
wanted: 18.2.0
react-native:
installed: 0.74.3
wanted: 0.74.3
react-native-macos: Not Found
npmGlobalPackages:
"*react-native*": Not Found
Android:
hermesEnabled: true
newArchEnabled: false
iOS:
hermesEnabled: true
newArchEnabled: false
堆栈跟踪或日志
N/A
重现器
https://github.com/trivikr/react-native-type-error-null-is-not-a-function 以重现
截图和视频
该错误最初出现在 AWS SDK for JavaScript v3 的 aws/aws-sdk-js-v3#6269(评论)中,其中错误被抛出
在重现器应用程序中,错误被抛出,但在 React Native 界面中显示为警告。
重现器的 README 中提供了截图
4条答案
按热度按时间wztqucjr1#
5jvtdoz22#
eivnm1vs3#
这个问题在所有支持的React Native版本中都可复现。
我在问题描述中更新了版本为
0.74.3
,这是复现时使用的版本。ukqbszuj4#
TypeScript类型允许在finally块中使用null和undefined。
https://github.com/microsoft/TypeScript/blob/12ae799eda74aca6a4051f1ebee4d2d0c8d817a2/src/lib/es2018.promise.d.ts#L11
然而,MDN上的Promise.prototoype.finally()提到
onFinally
是一个函数。MDN上的Promise.prototype.then()表示:如果它不是一个函数,那么它会被内部替换为一个恒等函数((x) => x),这个恒等函数只是将履行值向前传递。
我们怀疑Node.js和浏览器在传递null或undefined时复制了
then()
的行为,以便应用程序不会抛出错误。