首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >typescript的类型安全Immutable.Js getIn

typescript的类型安全Immutable.Js getIn
EN

Stack Overflow用户
提问于 2017-11-24 11:19:26
回答 0查看 771关注 0票数 1

有没有人能够为类型安全的不可变映射的getIn函数创建类型?

下面是我为it创建类型的尝试,这样它就可以与递归不可变映射一起工作。

代码语言:javascript
复制
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
}
EN

回答

页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47465870

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档