根据Typescript中的参数返回具有键值对的对象

时间:2020-01-29 08:30:44

标签: typescript

我想创建一个在对象中的键/值对上循环并返回具有相同键的对象的函数,但是每个值现在已成为一个函数。我想确保打字稿正确地掌握了返回对象的自动完成功能。这适用于以下愚蠢的功能:

interface Args {
  [layer: string]: Boolean
}

function sillyFunction<T extends Args>(layers: T): T {
  return layers
}

sillyFunction({ layerName: true }).layerName // this works

但是现在我有以下代码,其中layers对象(键/布尔对)用于创建具有键/函数对的新returnObject。

interface Args {
  [layer: string]: Boolean
}

interface ReturnedObject {
  [layer: string]: Function
}

function createFunctions<T extends Args>(layers: T): T {
  let returnObj = {} as ReturnedObject;

  for (let layer in layers) {
    returnObj[layer] = (label) => `${layer} ${label}`
  }

  return returnObj;
}

createFunctions({ layerName: true }).layerName // doesnt work

这显然给我错误'ReturnedObject'不能分配给类型T。如何确保打字稿'理解'对象内的键仍然相同,但是值已成为函数?

2 个答案:

答案 0 :(得分:2)

您需要使用映射类型将T转换为具有相同属性但每个属性都不同的新类型。在这种情况下,预定义类型Record会很好地工作,因为所有键的类型都相同。同样,我将比Function更具体地描述函数的类型,Function是函数签名的any,它允许使用任何参数进行调用

interface Args {
  [layer: string]: boolean
}

type ReturnedObject<T> =  Record<keyof T, (label: string) => string>

function createFunctions<T extends Args>(layers: T): ReturnedObject<T> {
  let returnObj = {} as ReturnedObject<T>;

  for (let layer in layers) {
    returnObj[layer] = (label) => `${layer} ${label}`
  }

  return returnObj;
}

var l = createFunctions({ layerName: true })
l.layerName("") 

Playground Link

答案 1 :(得分:-1)

您的“ createFunctions”返回类型为T,但您应该为ReturnedObject。

只需将返回类型定义为ReturnedObject

function createFunctions<T extends Args>(layers: T): ReturnedObject

它应该可以工作