【问题标题】:Problems mapping a typed object | Cannot invoke an expression whose type lacks a call signature映射类型化对象的问题 |无法调用其类型缺少调用签名的表达式
【发布时间】:2018-11-12 16:15:43
【问题描述】:

我有一个名为“容器”的对象,它将始终在每个键上包含相同类型的组件。

以下代码按预期工作

interface Dictionary<T> {
    [key: string]: T;
}

interface GameContainer {
    zIndex: number;
}

interface Game {
    containers: Dictionary<GameContainer>;
}

const game: Game = {
    containers: {
        a: { zIndex: 2 },
        b: { zIndex: 4 }
    }
}

尝试映射“容器”时出现问题

const something = game.containers.map(container => {
    console.log(container)
})

尝试后我得到了错误

无法调用类型缺少调用签名的表达式。类型“GameContainer”没有兼容的调用签名。

这对我来说很奇怪,因为在普通的 javascript 中这是可行的。

Here is a link to a typescript playground 这样你就可以看到错误了

【问题讨论】:

    标签: typescript dictionary


    【解决方案1】:

    试试这个:

    declare module namespace {
    
        export interface A {
            zIndex: number;
        }
    
        export interface B {
            zIndex: number;
        }
    
        export interface Containers {
            a: A;
            b: B;
        }
    
        export interface RootObject {
            containers: Containers;
        }
    
    }
    

    使用:

    const game: RootObject = {
        containers: {
            a: { zIndex: 2 },
            b: { zIndex: 4 }
        }
    }
    

    然后迭代这个:

    Object.keys(game.containers).map(function(key, index) {
       console.log(game.containers[key]);
    })
    

    【讨论】:

    • 在您的示例中,我收到错误消息>“容器”类型上不存在属性“地图”。容器也可以有无限数量的对象,如 c、d 或其他任何东西
    • 试试这个:Object.keys(game.containers).map(function(key, index) { console.log(game.containers[key]); })
    • 这行得通,但是...没有其他方法可以避免 Object.keys() 吗?
    • 有,可以将Containers替换为数组对象
    猜你喜欢
    • 2019-01-05
    • 2017-12-19
    • 2017-07-14
    • 2020-02-07
    • 1970-01-01
    • 1970-01-01
    • 2018-05-09
    • 2017-09-01
    • 2021-02-06
    相关资源
    最近更新 更多