根据打字稿中的参数返回带有键值对的对象

问题描述 投票:0回答:2

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

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。如何确保打字稿'理解'对象内的键仍然相同,但是值已成为函数?

typescript
2个回答
0
投票

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

仅将返回类型定义为ReturnedObject

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

它应该工作


0
投票

您需要使用映射类型将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

© www.soinside.com 2019 - 2024. All rights reserved.