gpt4 book ai didi

javascript - 如何在 TypeScript 中表达幂等(自展平)类型?

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

有些类型具有自展平性质,称为幂等:
enter image description here
https://en.wikipedia.org/wiki/Idempotence

Idempotence is the property of certain operations in mathematics and computer science whereby they can be applied multiple times without changing the result beyond the initial application.


在 JavaScript/TypeScript 中,我们有 对象/数字对象 例如幂等性。
一个真实的用例是在 TypeScript 中使用适当的类型编写自己的 Promises。你永远不可能拥有 Promise<Promise<T>>永远只有 Promise<T>因为 promise 会自动展平。例如,单子(monad)也会发生同样的情况。

console.log(
Number(5) === Number(Number(5))
); // true

简而言之,它通常表示为
TTX = TX
编辑:
事实上,这可能有点令人困惑;因为幂等永远不会有超过T的结构,JS数组形式 [foo] .
另一方面,monads 操作(用 Haskel 词绑定(bind))是 TTX = TX,但它确实具有像 [[foo]] 这样的结构。 . Array.map组成是 [[foo]] => [[[foo]]] Array.flatMap合成图+平面(TTX=TX)为 [[foo]] => [[foo]]我认为这是单子(monad),但不是幂等的。令人困惑,是的。
我以某种方式设法编写函数
const toObject = <A, X>(x: A): A extends T<X> ? A : //...
((X:object)=> {/* ... */})(Object(x)) ;
A extends T<X> ? A : //...在一些函数内部的上下文中工作,但是我不知道如何单独编写类型本身,即使有函数结构,它也很复杂,我觉得有些地方很不对劲。
我想知道和写的是TypeScript中幂等类型的定义
type T<X> = ???
//where
T<T<X>> === T<X>

最佳答案

您可以围绕某些内部类型编写一个幂等包装器:

// just for reference, more practically this could be Promise<T>
type InnerType<T> = [T];
type IdempotentWrapper<X> = X extends InnerType<unknown> ? X : InnerType<X>;

type Foo = IdempotentWrapper<number>; // equivalent to InnerType<number>
type Bar = IdempotentWrapper<IdempotentWrapper<number>>; // equivalent to InnerType<number> as well

关于javascript - 如何在 TypeScript 中表达幂等(自展平)类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69859942/

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