我想创建一个在对象中的键/值对上循环并返回具有相同键的对象的函数,但是每个值现在已成为一个函数。我想确保打字稿正确地掌握了返回对象的自动完成功能。这在以下傻功能中起作用:
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。如何确保打字稿'理解'对象内的键仍然相同,但是值已成为函数?
您的“ createFunctions”返回类型为T,但您应该为ReturnedObject。
仅将返回类型定义为ReturnedObject
function createFunctions<T extends Args>(layers: T): ReturnedObject
它应该工作
您需要使用映射类型将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("")