簡體   English   中英

鍵入safe Immutable.Js getIn作為打字稿

[英]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
}

顯然,這對於通用情況當前是不可能的,但是您可以將其重載幾個元組長度。 請參閱此處的相關討論:

https://github.com/Microsoft/TypeScript/issues/12290

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM