[英]type safe Immutable.Js getIn for typescript
有沒有人能夠為不可變地圖的類型安全的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
}
顯然,這對於通用情況當前是不可能的,但是您可以將其重載幾個元組長度。 請參閱此處的相關討論:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.