【问题标题】:Why I can't call keys() on a Typescript Map?为什么我不能在 Typescript Map 上调用 keys()?
【发布时间】:2020-07-16 21:52:10
【问题描述】:

在 Typescript 程序 (3.9.6) 中,我有一个变量 p,我认为它是一个 Map。从 console.log(p) 我得到:

Map(2) { 'A' => 0, 'B' => 2}

但是,我似乎无法获取密钥:console.log(p.keys()) 甚至无法编译:

 error TS2349: This expression is not callable.
 Type 'Number' has no call signatures.
 console.log(p.keys());

变量p似乎来自这里:

function f(q: IQ){
   ...
   let p=q.data;
   console.log(p);
   console.log(p.keys());
   ...

智商定义为

export interface IQ {
   data: IData;
}
export interface IData {
     [key: string]: number
}

不知道怎么回事,我卡住了

【问题讨论】:

    标签: typescript variable-types


    【解决方案1】:

    p 的类型是 IData,而不是 Map(或者至少 TypeScript 在编译时是这样看待它的)。

    如果在运行时确实是IData,则使用Object.keys(p) 获取密钥。

    如果它真的是Map,你可以像console.log((p as any as Map<string, number>).keys())一样投射它。但是,这意味着类型不正确,最好修复类型而不是强制转换。

    【讨论】:

    • Object.keys(p) 给出:['$__parent', '$__path', '$__schemaType']。而且我可以使用 p['$__parent]['data']... 访问真正的密钥...在我看来这太令人费解了。另一方面,强制转换未编译:“IData”类型缺少“Map”类型的以下属性:clear、delete、forEach、get 和另外 8 个。
    • 试试(p as any as Map<string, number>)
    • 哦,是的,这行得通!谢谢。我想知道整体解决方案是否“有缺陷”或者对于打字稿来说不是那么惯用的。有没有更好的方法来创建接口和数据结构?
    • 嗯,是的 - 如果它在运行时是 Map,那么它在编译时不应该是 IData。代码的其他部分可能有问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-17
    • 1970-01-01
    • 1970-01-01
    • 2019-06-15
    • 2019-03-02
    • 2017-10-14
    相关资源
    最近更新 更多