gpt4 book ai didi

typescript - 是否可以将变量标记为仅使用一次?

转载 作者:行者123 更新时间:2023-12-03 13:50:24 24 4
gpt4 key购买 nike

考虑以下代码:

const a = initialValue()
const b = f(a)
const c = g(b)

我想做些事情,以便在第二次引用 a时,将出现编译错误。
const d = h(a) // Compile error: `a` can be only referenced once

我需要这样做以防止从我不应该再使用的变量中导出错误的值。

因此,我想知道在TypeScript中是否可能(在编译期间)?如果没有,我可以考虑其他选择吗?

额外的节点:我需要此功能的主要原因是分解一个很长的值推导过程以 来提高代码可读性

想象一下,值(value)推导是这样的:
const finalValue = q(w(e(r(t(y(u(i(o(p(a(s(d(f(g(h(j(k)))))))))))))))))))

显然有必要将其分解为几个部分,这就是为什么我需要在同一范围中只能使用一次 的临时变量的原因。

编辑:添加了一个现实的例子
type Point = {x: number, y: number}
const distance = (a: Point, b: Point): number => {
return Math.sqrt(Math.pow(a.x - b.x, 2) + Math.pow(a.y - b.y, 2))
}

显然,上面的distance函数不太可读,因此我通过引入临时变量将其分解。
const distance = (a: Point, b: Point): number => {
const xDistance = Math.pow(a.x - b.x, 2)
const yDistance = Math.pow(a.y - b.y, 2)
return Math.sqrt(xDistance + yDistance)
}

但是然后我又遇到了一个问题,我不会多次使用这些变量,在这种情况下,是xDistanceyDistance。多次引用它们会引入错误。

例如,多次引用xDistance会引入无法通过类型检查检测到的逻辑错误:
const distance = (a: Point, b: Point): number => {
const xDistance = Math.pow(a.x - b.x, 2)
const yDistance = Math.pow(a.y - b.y, 2)
return Math.sqrt(
xDistance +
xDistance // should be `yDistance`
)
}

最佳答案

我建议使用某种pipe以可读的方式组成函数:

increment(increment(multiply(2)(toLength("foo")))) // 8
变成
flow(
toLength,
multiply(2),
increment,
increment
)("foo") // 8
这样可以防止临时变量(如 @Bart Hofland said),同时保持代码干净。
Playground sample
(这是 fp-ts库中的 flow实现)

如果您真的(真的)需要像“一次性”变量这样的编译时检查:
type UsedFlag = { __used__: symbol } // create a branded/nominal type 
type AssertNotUsed<T> = T extends UsedFlag ? "can be only referenced once" : T

const a = 42 // a has type 42
const b = f(a)
markAsUsed(a)
a // now type (42 & UsedFlag)
const d = h(a) // error: '42 & UsedFlag' is not assignable '"can be only referenced once"'.

function markAsUsed<T>(t: T): asserts t is T & UsedFlag {
// ... nothing to do here (-:
}

function f(a: number) { }
function h<T>(a: AssertNotUsed<T>) { }
Playground sample

关于typescript - 是否可以将变量标记为仅使用一次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61769496/

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