gpt4 book ai didi

typescript - 函数名末尾的问号有什么作用?

转载 作者:行者123 更新时间:2023-12-05 01:32:19 24 4
gpt4 key购买 nike

我刚遇到下面的 typescript 代码

class Foo {
start?(): void {}
}

注意 ? 最后的 start

它似乎使那个函数成为可选的(一个函数怎么可能是可选的,为什么你需要那样的东西),因为现在我必须做

const x = new Test();
x.start!();

注意 start 末尾的 !

所以我的问题是,这个问号到底在做什么?

最佳答案

这是一个可选属性,如果设置了值,则值为函数。

它(或多或少)是这个的简写:

{
start: (() => void) | undefined
}

这意味着 start 属性可能有也可能没有函数作为它的值。这意味着如果你想调用那个函数,你想处理它不存在的情况:

if (foo.start) {
foo.start()
}

或使用 optional chaining operator这是可选属性运算符的逆运算:

foo.start?.()

在大多数情况下,您应该避免使用 ! 后缀运算符,因为它会强制 typescript 允许潜在的不安全操作。如果该属性确实是 undefined,那么无论如何强制调用它都会引发运行时错误。


这是一个更完整的例子:

class Foo {
start?(): void

constructor(isStartable: boolean) {
if (isStartable) {
this.start = () => console.log('starting!')
}
}
}

const nonStartable = new Foo(false)
// Will not call the start method.
if (nonStartable.start) nonStartable.start()

const startable = new Foo(true)
// Will call the start method.
if (startable.start) startable.start()

// If you run this code "starting!" is logged exactly once.

Playground

关于typescript - 函数名末尾的问号有什么作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65619838/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com