【问题标题】:Typescript - define type for irregular object structureTypescript - 定义不规则对象结构的类型
【发布时间】:2023-03-08 01:02:01
【问题描述】:

我想正确输入具有以下结构的 Comparator 对象:

const Comparator: ComparatorType = {
  string: {
    equals: function(a: string, b: string) {...},
    notEquals: function(a: string, b: string) {...},
    contains: function(a: string, b: string) {...}
    ...

  },
  number: {
    equals: function(a: number, b: number) {...},
    lowerThan: function(a: number, b: number) {...},
    greaterThan: function(a: number, b: number) {...}
    ...
  },
  datetime: {...}
}

如您所见,一些函数对于多种数据类型(如equal)是通用的,但其他函数是唯一的。我能够想出:

type DataType = "string" | "integer" | "datetime"
type Operation = "equals" | "notEquals" | "contains" | "notContains" | ...

// and define functions:
type CompareStringCommonFunc = (
  a: string,
  b: string
) => boolean

type CompareIntegerCommonFunc = (
  a: number,
  b: number
) => boolean

...others...

所以我终于可以像这样想出ComparatorType

type ComparatorType = {
  [dataType in DataType]: {
    [funcName in Operation]:
      | CompareStringCommonFunc
      | CompareStringInFunc
      | CompareStringBetweenFunc
      | CompareIntegerCommonFunc
      | CompareIntegerBetweenFunc
      | CompareIntegerInFunc
  }
}

但它显然不起作用,因为Comparator 不规则(我的意思是每个DataType 没有所有Operations)而且我的打字稿知识还没有那么深,无法在我的自己的。我该如何解决它,以便我可以为 string DataType 仅分配几个具有特定功能的 Operation 值?

【问题讨论】:

    标签: typescript


    【解决方案1】:

    我想说的只是保持简单。尝试将类型和值“映射”到更复杂的结构会使事情变得复杂,尤其是当函数的名称、数字和类型对于每个“类型”都不同时。你可以更明确地定义你的ComparatorType

    type CompareFn<T> = (a: T, b: T) => void;
    
    type ComparatorType = {
        string: {
            equals: CompareFn<string>,
            notEquals: CompareFn<string>,
            contains: CompareFn<string>
        },
        number: {
            equals: CompareFn<number>,
            lowerThan: CompareFn<number>,
            greaterThan: CompareFn<number>
        },
        // etc
    }
    

    这里的CompareFn 只是一种通用实用程序类型,用于简化函数类型的定义,它们似乎都有相同的参数模式,只是类型不同。

    如果需要,您仍然可以拥有类型 DataType,通过对这种类型的键进行逆向工程:type DataType = keyof ComparatorType;。然而,逆向工程通用Operation 类型更加困难,因为equalsnotEquals 等键在ComparatorType 的“类型”之间不一致。但是您仍然可以通过 keyof ComparatorType['string']keyof ComparatorType['number'] 等轻松获取与特定类型关联的键。

    【讨论】:

      猜你喜欢
      • 2016-12-02
      • 2022-01-17
      • 2021-03-16
      • 2019-05-10
      • 2016-12-23
      • 2020-04-14
      • 1970-01-01
      • 2021-01-29
      • 2023-03-30
      相关资源
      最近更新 更多