gpt4 book ai didi

recursion - 在 FlowJS 中递归创建只读对象

转载 作者:行者123 更新时间:2023-12-04 15:07:02 24 4
gpt4 key购买 nike

在 redux 中,状态应该是不可变的。我希望 Flow 阻止任何人改变该状态。因此,给定一个任意深度的对象:

type object = {
a: {
b: {
d: string
}
},
c: number
}

如何创建递归只读的新类型,以便我 不能 做:
let TestFunction = (param: $RecursiveReadOnly<object>) => {
param.a.b.d = 'some string'
}

内置 $ReadOnly Flow 的实用程序将创建一个这样的类型,即 不是 需要什么,因为 b & d仍然可写:
{
+a: {
b: {
d: string
}
},
+c: number
}

我一直在尝试使用 $Call & $ObjMap(i) ,但我不知道如何在 Flow 中递归移动对象。目标是有这个:
{
+a: {
+b: {
+d: string
}
},
+c: number
}

最佳答案

感谢 kalley对于他的解决方案。据我了解,kalley试图使函数接收到的任何对象递归地只读。因为我真的只需要已知对象作为参数,所以这很完美:

// Type definition that works with arbitrary nested objects/arrays etc.
declare type RecursiveReadOnly<O: Object> = $ReadOnly<$ObjMap<O, typeof makeRecursive>>
declare type RecursiveReadOnlyArray<O: Object> = $ReadOnlyArray<$ReadOnly<$ObjMap<O, typeof makeRecursive>>>
type Recursive<O: Object> = $ObjMap<O, typeof makeRecursive>

declare function makeRecursive<F: Function>(F): F
declare function makeRecursive<A: Object[]>(A): $ReadOnlyArray<$ReadOnly<Recursive<$ElementType<A, number>>>>
declare function makeRecursive<O: Object>(O): RecursiveReadOnly<O>
declare function makeRecursive<I: string[] | boolean[] | number[]>(I): $ReadOnlyArray<$ElementType<I, number>>
declare function makeRecursive<I: string | boolean | number | void | null>(I): I

// Usage example.
type obj = {
a: {
b: {
d: string,
}
}
}


let TestFunction = (param: RecursiveReadOnly<obj>) => {
param.a.b.d = 'some string' // Flow throws an error
}

关于recursion - 在 FlowJS 中递归创建只读对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48634206/

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