Walrus运算符TypeScript等效if语句

nx7onnlm  于 2022-11-26  发布在  TypeScript
关注(0)|答案(1)|浏览(168)

this question极其相似,但w.r.t改为if语句:

import { argv } from "process"

function foo(input: string): boolean
{
    return input === "ppp";
}

for (let i=0, v; v = foo(process.argv[2]) && i < 1; i++)
//if (let v = foo(process.argv[2]))
{
    console.log(v);
}
// console.log(v); <--- compile-time error, good !

有没有办法在if语句中定义一个类似Walrus的运算符?

% npx tsc --target es2022 --moduleResolution node example.ts
example.ts:9:9 - error TS1005: ')' expected.

9 if (let v = foo(process.argv[2]))
          ~
z5btuh9x

z5btuh9x1#

不,这在if中是不可能的。

...
{ 
  let v= ...; 
  if (v) {
    ...
  }
  console.log(v); // no error here
} 
console.log(v) // compile error here
...

当然,你也可以滥用for循环,比如在第一次迭代时,break就退出,或者把v设为falsey,类似于i,但不需要额外的变量。

for (let v = ...; !!v;) {
  console.log(v);
  break;
}

for (let v = ...; !!v; v=undefined) {  //or whatever falsey fits the type of your v
  console.log(v);
}

但恕我直言,这两个变体都相当丑陋,也不是很直观。(第二个似乎稍微好一点)而且如果有人不小心删除了break,你最终会陷入无尽的循环。
我会用额外的块...
在你所展示的例子中,v实际上是一个boolean,你根本不需要这个变量。

if (foo(...)) {
  console.log(true);
}

但我怀疑您是否会在所有用例中都使用boolean ...

相关问题