首页 > 解决方案 > 打字稿。定义函数对象的类型

问题描述

沙盒来

我有一个具有不同功能的对象

const objectOfFunctions = {
  getFromNumber: (arg: number) => arg,
  getFromString: (arg: string) => arg,
  getFromBoolean: (arg: boolean) => arg
};

我需要为数据定义类型

const data: DataTypes = [
  {
    type: 'getFromNumber',
    arg: 1
  },
  {
    type: 'getFromNumber',
    arg: 10
  },
  {
    type: 'getFromString',
    arg: 'qwerty'
  },
  {
    type: 'getFromBoolean',
    arg: true
  }
];

我的类型是:

type TypeOfObject = typeof objectOfFunctions;
type ObjectKeys = keyof TypeOfObject;
interface ObjectType<T extends ObjectKeys> {
  type: T
  arg: Parameters<TypeOfObject[T]>[0];
}

type DataTypes = (
  ObjectType<'getFromNumber'> |
  ObjectType<'getFromString'> |
  ObjectType<'getFromBoolean'>
)[]

为数组的每个元素执行所需的功能。

data.forEach((dataItem) => {
  const func = objectOfFunctions[dataItem.type];
  const {arg} = dataItem;
  func(arg)
})

typesctipt 抛出错误:

TS2345: Argument of type 'string | number | boolean' is not assignable to parameter of type 'never'.
  Type 'string' is not assignable to type 'never'.
    const func = objectOfFunctions[dataItem.type];
    const {arg} = dataItem;
  > func(arg)
         ^^^
    })

如何正确定义 DataTypes 的类型?

提前致谢 :)

标签: typescript

解决方案


推荐阅读