与这个问题非常相似,但w.r.tto 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语句中定义海象-like操作符吗?
% npx tsc --target es2022 --moduleResolution node example.ts
example.ts:9:9 - error TS1005: ')' expected.
9 if (let v = foo(process.argv[2]))
~发布于 2022-11-24 10:42:07
不,用if是不可能的。如果你想缩小v的范围,你可以做的最好的事情就是创建一个新的块
...
{
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);
}但IMHO的这两种变体都很难看,而且不太直观。(第二个似乎稍微好一些),如果有人意外地移除了break,您最终会陷入一个没完没了的循环。
我想再加一个街区..。
在您的示例中,v实际上是一个boolean,您根本不需要这个变量。你可以就这么做
if (foo(...)) {
console.log(true);
}但我怀疑你所有的用法都会有boolean.
https://stackoverflow.com/questions/74559227
复制相似问题