javascript - typescript 的类型安全 Immutable.Js getIn

标签 javascript typescript immutable.js

有人能够为 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
}

最佳答案

显然,这对于一般情况目前是不可能的,但您可以将其重载几个元组长度。请参阅此处的相关讨论:

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

关于javascript - typescript 的类型安全 Immutable.Js getIn,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47465870/

相关文章:

javascript - 更改 Controller 内的模型对象来操作 DOM 对象

javascript - 如何知道一个对象是否由 Immutable 创建

javascript - 用于提升 React 性能的 Immutable.js 替代方案

immutable.js - immutablejs mergeWith 对象但覆盖新列表

javascript - 如何在带有 Handlebars 的 json 文件中获取对象键

javascript - ExtJS、Flask 和 AJAX : cross-domain request

javascript - 可通过键盘使用下拉语言键

typescript :函数声明中接口(interface)属性的类型安全

angular - 依赖于其他效果结果的链式效果

javascript - 如何在执行任何类方法之前注入(inject)条件检查