Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

void 在 JavaScript 与 TypeScript 中的对比使用 #58

Open
sisterAn opened this issue Sep 23, 2019 · 0 comments
Open

void 在 JavaScript 与 TypeScript 中的对比使用 #58

sisterAn opened this issue Sep 23, 2019 · 0 comments

Comments

@sisterAn
Copy link
Owner

如果你对强类型有所了解的话,你一定听说过或使用过 void ,它代表调用的方法不存在任何返回内容。

void 同样在 JavaScript 以及 TypeScript 中也存在,只不过,在 JavaScript 中,void 作为一个操作符,而在 TypeScript 中,void 作为一个基本类型,并且它在 JavaScriptTypeScript 中的使用,也是有所不同的。

JS 中的 void

JavaScriptvoid 是计算其临近的表达式的运算符。无论计算哪个表达式,void 始终返回 undefined

let i = void 2; // i === undefined

直接定义 let i 不好吗,为什么要使用 void 2

首先,在 JavaScript早期,人们能够重写 undefined 并赋予它一个真实的值。而 void 则能返回真正的 undefined

其次,它是调用立即执行函数的好方法:

void function() {
  console.log('What')
}()

在不污染全局命名空间的情况下:

void function aRecursion(i) {
  if(i > 0) {
    console.log(i--)
    aRecursion(i)
  }
}(3)

console.log(typeof aRecursion) // undefined

由于 void 始终返回 undefined ,并且 void 始终计算其临近的表达式,因此你可以通过返回一个 void 函数,即不会返回任何具体值,但仍调用 void 临近函数,例如:

// 返回 undefined,但仍执行了 nextCallback()
function middleware(nextCallback) {
  if(conditionApplies()) {
    return void nextCallback();
  }
}

这就是 void 最重要的功能:它是应用的安全门。当函数需要始终返回 undefined 时,可以使用 void

button.onclick = () => void doSomething();

TS 中的 void

TypeScript 中的 voidundefined 的子类型。 JavaScript 中的函数总是返回一个值,或 undefined

function iHaveNoReturnValue(i) {
  console.log(i)
} // returns undefined

由于 JavaScript 没有返回值的函数总是返回 undefined ,而 voidJavaScript 中又总是返回 undefined ,因此 TypeScript 中的 void 是一种类型,它代表此函数返回 undefined

declare function iHaveNoReturnValue(i: number): void

void 也可以用于参数列表或其他声明中。 它唯一可以传递的值是 undefined

declare function iTakeNoParameters(x: void): void

iTakeNoParameters() // 👍
iTakeNoParameters(undefined) // 👍
iTakeNoParameters(void 2) // 👍

因此 voidundefined 几乎相同。 不过,两者之间也有一点小小的但很重要的差异: void 作为返回类型可以用不同的类型代替,以允许使用高级回调模式

function doSomething(callback: () => void) {
  let c = callback() // 在这里, callback 始终返回 undefined
  //c 也是 undefiend 类型
}

// 这个函数返回一个 number
function aNumberCallback(): number {
  return 2;
}

// 这样使用,确保类型安全 👍 
doSomething(aNumberCallback) 

这是期望的行为,经常在 JavaScript 应用程序中使用。

如果你想要函数仅仅返回 undefined ,请调整你的回调方法签名:

// function doSomething(callback: () => void) {
// 调整为
function doSomething(callback: () => undefined) { /* ... */ }

function aNumberCallback(): number { return 2; }

// 类型不匹配 💥 
doSomething(aNumberCallback) 

至此,你将会更好的使用 void

参考

https://fettblog.eu/void-in-javascript-and-typescript/

@sisterAn sisterAn changed the title void 在 JS 与 TS 中的对比使用 void 在 JavaScript 与 TypeScript 中的对比使用 Sep 23, 2019
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant