Vs 代码 > 输出 > 更漂亮
2/23/2020, 12:10:36 PM:
-----------------------
Expression expected. (/Users/yanivper/dev/test/test.ts:2:23)
1 | function test(obj) {
2 | return obj.a?.b;
^
Run Code Online (Sandbox Code Playgroud)
在一个新项目中:
npm i typescript
Run Code Online (Sandbox Code Playgroud)
VScode 使用 Workstation Version 3.8.2(显示在左下栏 TypeScript 3.8.2 ) Prettier v 2.2.2
我有一个async返回可选String.
func traverse(file:URL, for string:String) async throws -> String? {
...
}
Run Code Online (Sandbox Code Playgroud)
我想运行这个函数,如果nil,使用不同的参数运行它,如下所示:
async let langRes = try traverse(file: languageFile, for: string)
async let engRes = try traverse(file: englishFile, for: string)
let result = try await langRes ?? engRes
Run Code Online (Sandbox Code Playgroud)
但可选的默认值engRes会给出错误:
不支持并发的自动闭包中的“async let”
像这样的东西工作正常:
let result = try await langRes ?? ""
Run Code Online (Sandbox Code Playgroud)
它只是不喜欢使用async默认/后备函数。
我知道我可以这样做:
var result = try await langRes
if result == nil {
result = try await engRes
} …Run Code Online (Sandbox Code Playgroud) console.log("#1", "a12312a".match(/^\d+/)?.[0].length);
console.log("#2", ("a12312a".match(/^\d+/)?.[0]).length);Run Code Online (Sandbox Code Playgroud)
我在写一些代码时偶然发现了一些我不明白的东西。在 Chrome 89.0.4389.128 (Official Build) (64-bit) 中,上面的代码给出了这个:
#1 undefined
Uncaught TypeError: Cannot read property 'length' of undefined
Run Code Online (Sandbox Code Playgroud)
这两行在我看来是一样的:"a12312a".match(/^\d+/)?.[0]is an undefined,并且他们试图读取 的属性length,该属性undefined应该抛出 a TypeError。但是第一行没有,而第二行没有。
…为什么?我糊涂了。我错过了一些非常基本的东西吗?
根据Apple文档,可选链接如下:
如果可选值为非零,则通过在要调用属性,方法或下标的可选值之后放置问号(?)来指定可选链接....当可选项为零时,可选链接优雅地失败...
我对此的解释是,以下结构是可选链接:
someMasterObject.possiblyNilHandler?.handleTheSituation()
...如果处理程序不是nil,则上面的行将调用handleTheSituation方法,如果处理程序为nil,则优先失败(跳过行).
但是,我看到的可选链接的几乎所有示例都使用"if let"构造,如下所示:
if let handler = someMasterObject.possiblyNilHandler{
handler.handleTheSituation()
}
Run Code Online (Sandbox Code Playgroud)
事实上,我在网上找到的文档和示例大量使用了与可选链接相关的"if let"结构,看起来似乎是IS可选链接.
但是,我是否正确假设我的第一个示例是支持使用可选链接,并且if let构造是使用(或紧密绑定)可选链接的另一个构造?
在赋值语句的左侧使用可选链接是什么意思?如果可选变量为nil,应用程序会崩溃吗?
例如
// cell is a UITableViewCell
cell.textLabel?.text = "Test"
Run Code Online (Sandbox Code Playgroud) 我在代码中有一个 if 语句,它检查是否定义了一个对象,然后检查其属性之一的相等性。我的 if 语句是这样的:
if(obj && obj.a !== x) { // do something }
Run Code Online (Sandbox Code Playgroud)
但是现在我使用了可选链接并将 if 语句更改为:
if(obj?.a !== x) { // do something }
Run Code Online (Sandbox Code Playgroud)
但是现在我的代码在这种情况下无法正常工作。即使 obj 未定义,代码也会输入 if 语句。请有人解释为什么会发生这种情况?
Currently I am using below code for destructuring:
const myObj1 = {name: 'Abc'}
const {name} = myObj1
console.log(name)
const myObj2 = null
const {name2} = myObj2 // this will give errorRun Code Online (Sandbox Code Playgroud)
Now, since we have optional chaining, I can do this:
const myObj = {name: 'Abc'}
const {name} = myObj
console.log(name) // 'Abc'
const myObj2 = null
const name2 = myObj2?.myObj2
console.log(name2) // undefinedRun Code Online (Sandbox Code Playgroud)
是否有更好的方法或安全的方法来使用无效合并或可选链接进行解构?
javascript destructuring optional-chaining nullish-coalescing
我有一个正在访问的响应:data?.currentOrganization?.onboardingSteps?。您可以猜到,data、currentOrganization 和 onboardingSteps 可能都为 null。我想分配一个变量如下:
const hasSteps = data?.currentOrganization?.onboardingSteps?.length > 0;
我认为如果任何字段为空或少于 1 个步骤,hasValue 将评估为 false。但是,我收到了 TypeScript 错误:Object is possibly 'undefined'.
这就是我目前解决它的方式:
const hasSteps =
data?.currentOrganization?.onboardingSteps != null &&
data?.currentOrganization?.onboardingSteps?.length > 0;
Run Code Online (Sandbox Code Playgroud)
这感觉不必要地冗长。有没有替代的,更优雅的解决方案?
在react react native中运行android项目时出现此错误。
这是React本机版本“ react”的新安装:“ ^ 16.3.1”,“ react-native”:“ ^ 0.57.1”,
它给出了可选链接的错误。任何人都可以帮助我如何在react native中启用可选链接。
Loading dependency graph, done.
BUNDLE [android, dev] ....../index.js ???????????????? 64.3% (667/832)::ffff:127.0.0.1 - - [02/Oct/2018:04:30:46 +0000] "GET /index.delta?platform=android&dev=true&minify=false HTTP/1.1" 500 - "-" "okhttp/3.10.0"
error: bundling failed: SyntaxError: C:\ReactNative\mrn\node_modules\react-native\Libraries\Components\Switch\Switch.js: Support for the experimental syntax 'optionalChaining' isn't currently enabled (103:41):
101 | // Support deprecated color props.
102 | let _thumbColor = thumbColor;
103 | let _trackColorForFalse = trackColor?.false;
| ^
104 | let _trackColorForTrue = trackColor?.true;
105 |
106 | …Run Code Online (Sandbox Code Playgroud) 为什么 Google Apps 脚本不支持最新的 javascript 功能(例如可选链接),即使它在 Chrome V8 上运行?当使用可选链接时,clasp 会抛出错误。
GaxiosError: Syntax error: ParseError: Unexpected token .
运行时环境已在清单文件中提到appsscript.json:
{
...
"runtimeVersion": "V8",
...
}
Run Code Online (Sandbox Code Playgroud) javascript ×5
swift ×3
babeljs ×1
boolean ×1
option-type ×1
optional ×1
prettier ×1
react-native ×1
typescript ×1
uitableview ×1