有没有人能够为Immutable Map的类型安全的getIn函数创建打字?
下面是我为它创建打字的尝试,以便它可以处理递归的不可变映射。
import * as Immutable from 'immutable'
type ImmutableType = '0'
type PartialType = '1'
type PrimitiveType = '2'
type SchemaTypes = ImmutableType | PartialType | PrimitiveType
type Switch<Type extends SchemaTypes, K extends Schema<Type>> = {
0: ImmutableExtra<K> & Immutable.Map<keyof K, any>
1: Partial<K>;
2: K
}[Type];
type ImmutableParent = Switch<ImmutableType, ParentSchema<ImmutableType>>
let immutableParent: ImmutableParent
const childStringViaGet = immutableParent.get("child").get("childString") //typesafe. type is string
//Can't figure out this part
const childStringViaGetIn = immutableParent.getIn(["child", "childString"]) //not typesafe. type is any. Can't figure it out
interface Schema<T extends SchemaTypes> {
}
export interface ImmutableExtra<T extends Schema<ImmutableType>> {
get<K extends keyof T>(value: K): T[K]
getIn<A extends keyof T>(keys: [A]): T[A]
// Things I tried but doesn't work
// getIn<A extends keyof T, B ChildImmutable extends T[A]>(keys: [A, B]): T[A]["get"]
//getIn<A extends keyof T, B extends keyof T[A]>(keys: [A]): T[A][B]
//getIn<A extends keyof T, B extends keyof ChildType, ChildType, ChildImmutable extends T[A] & ImmutableExtra<ChildType>>(keys: [A, B])
}
interface ParentSchema<T extends SchemaTypes> {
parentString: string
parentNumber: number
child: Switch<T, ChildSchema<T>>
}
interface ChildSchema<T extends SchemaTypes> {
childString: string
childNumber: number
}
答案 0 :(得分:0)
显然目前这种情况不适用于通用案例,但你可以将它重载几个元组长度。请参阅此处的相关讨论: