打字稿强制对象文字无法按预期工作

时间:2019-11-05 13:11:33

标签: typescript

在创建不强制执行任何原始值的对象文字时遇到问题。

当我尝试使用基元进行映射时


interface StringMap {[key:string]: string }

let foo:StringMap = {
    "key_a": "bar",
    "key_b": 12 //works as expected Type 'number' is not assignable to type 'string'
}

但是当我创建自己的对象时,地图结构并未得到实施。

class ChargeGroup{
}

interface ChargeGroupMap { [ key: string ]: ChargeGroup }
type ChargeGroupMap = { [ key: string ]: ChargeGroup } //tried this aswell

let foo:ChargeGroupMap = {
    "key_c": new ChargeGroup()
    "key_a": "bar", //no error
    "key_b": 12, //no error
}

当前tsconfig.json

{
    "compilerOptions":{
        "target": "es6",
        "strict": true,
        "watch": true,
        "lib": ["dom", "es2018"],
        "types": [
            "dinero.js",
            "angular"
        ],
        "allowUmdGlobalAccess": true,
        "allowSyntheticDefaultImports": true,
        "removeComments": true,
        "alwaysStrict": true,
        "outFile": "../script/invoice.js",
        "noEmitOnError": true
    },
    "exclude": [
        "node_modules"
    ]
}

在此问题上的任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:3)

您的课程为空。 Typescript使用结构兼容性,因此您的空类等效于{},即没有要求的类型。这意味着可以为它分配任何内容,包括numberstring。将属性添加到类中后,您将收到错误消息。

class ChargeGroup{
    private notStructural!: unknown
}

interface ChargeGroupMap { [ key: string ]: ChargeGroup }


let foo:ChargeGroupMap = {
    "key_c": new ChargeGroup(),
    "key_a": "bar", //no error
    "key_b": 12, //no error
}

Play