【问题标题】:How to enforce datatype of key and value in map in JS如何在 JS 中的 map 中强制执行键和值的数据类型
【发布时间】:2022-01-24 08:25:03
【问题描述】:

假设我正在创建一个像这样的map

let myMap = new Map();

我们知道keyvalue 都可以是任何类型。 但是我有一个要求,我需要对键强制使用 Integer,对值强制使用 String。

例如:

1 => 'Apple'
2 => 'Ball'
3 => 'Cat'

应在编译时检查任何违反此规则的尝试。 但是当我尝试做一些类似的事情时,我遇到了语法错误:

  let myMap = new Map<integer,string>();

请帮忙。

【问题讨论】:

  • @Ivar,不是真的。我还在寻找答案
  • 这令人困惑。您已经用 TypeScript 标记了这个问题并且正在谈论“编译时间”,但是您使用 TypeScript? JavaScript 本身没有编译时类型检查,所以没有多大意义。
  • 是的,我同意。我想我把它弄复杂了。让我们坚持我想在 JS 中的 map 中强制执行数据类型
  • @Ivar,我已经编辑了问题。

标签: javascript typescript


【解决方案1】:

Javascript 没有 integer 类型,只有 number。因此,您需要像这样定义它。

 let myMap = new Map<number,string>();

您可以定义一个 setter 来验证密钥,像这样

Number.isInteger(data) // returns weither or not data is an int

【讨论】:

    【解决方案2】:

    在 Typescript 中,您可以使用:

     const myMap: Map<number, string> = new Map<number, string>();
    

    很遗憾,您不能在 Javascript 中进行这种检查。

    【讨论】:

    • SyntaxError: Missing initializer in const declaration
    • 确定一下,您使用的是 TypeScript 还是 JavaScript?
    • 我正在使用问题中提到的 JavaScript
    • 你应该删除 typescript 标签。您不能在 Javascript 中使用打字,这是 Typescript 的功能。没有办法在 javascript 中进行这种编译检查。
    【解决方案3】:

    Javascript 本身不提供任何语法来支持泛型类

    你可以尝试使用下面这个类来编写,它扩展了 Map。

    class Map2 extends Map{
    
        constructor(keyType, valueType){
            super()
            this._keyType = keyType;
            this._valueType = valueType;
            
        }
    
    
        _matchesType(key,value){
            return (typeof(key) === this._keyType) && (typeof(value) === this._valueType);
        }
    
    
        set(key, value){
           if(!this._matchesType(key,value))
                 throw 'Type Mismatch Exception';
           super.set(key,value)
        }
    
    }
    

    然后使用 Map2 代替普通 Map,在构造函数中使用类型。 像这样,

    const m2 = new Map2('number', 'string');
    
    m2.set(1,'apple');
    m2.get(1); //returns 'apple'
    
    m2.set('test', 'test value') // throws Type Mismatch Exception
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-05-12
      • 2011-04-24
      • 2020-03-18
      • 2023-03-08
      • 2013-08-11
      • 1970-01-01
      • 1970-01-01
      • 2020-09-01
      相关资源
      最近更新 更多