TypeScript错误:未在文字中定义仅Getter属性

时间:2019-03-16 13:43:20

标签: typescript

这感觉真是一个愚蠢的错误,但是我有一个打字稿课:

export class Stat{
    abbr: StatType;
    score: number;
    mod: number;
    get name(): string { return StatType[this.abbr]; }
}

“名称”属性是只读的,对吧?

但是,在虚拟化一些“统计信息”时,出现了我未定义“名称”的错误。

const stats: Stat[] = [{
    abbr: StatType.Str,
    score: 15,
    mod: 2
}]

哪个会产生错误:error TS2741: Property 'name' is missing in type '{ abbr: StatType.Str; score: number; mod: number; }' but required in type 'Stat'但是,如果属性“名称”是只读的,为什么我必须为其分配一个值?

如果我分配一个值,然后使用该值,则get()属性将被完全忽略。

我做错什么了吗?如何说服TS我不需要提供name属性?

枚举是这样定义的:

export enum StatType{
    Str,
    Dex,
    Con,
    Int,
    Wis,
    Cha
}

谢谢!

2 个答案:

答案 0 :(得分:0)

创建 getter setter 时,打字稿将为您生成以下代码:

export class Stat{
    abbr: StatType;
    score: number;
    mod: number;
    _name: string

Object.defineProperty(foo.prototype, "name", {
        get: function () {
            return  { return StatType[this.abbr]; };
        },
        set: function (theName) {
            this._name = theName;
        },
        enumerable: true,
        configurable: true
    });
}

您可以通过覆盖默认行为来解决此问题,例如:

export class Stat{
    abbr: StatType;
    score: number;
    mod: number;
     Object.defineProperty(this,'name',{
               get(){return StatType[this.abbr]; }
              });
}

答案 1 :(得分:0)

最后编辑:好吧,因此从技术上来说可以正常工作,但是对象没有转换为Stat,因此无法获得吸气剂。它“有效”(就TS而言),但是getter是不确定的,除非我手动将其添加到对象中。 (我的浏览器肯定有一个肮脏的缓存或其他东西。)

所以我最终要做的是创建一个“模拟”服务,可以为我存根对象。我不必将其注入到任何类或任何东西中,我可以在类外声明它(只是重新添加它),并使用它来生成我想要的对象。这给了我:能够使我的实际对象(带有吸气剂),对象的空构造函数,并且不会弄脏我的服务类(尽管我正在弄脏文件...我可以清理文件...实施http)。

...此时,实现http可能会更快。

编辑:好吧,这是真正的答案:只需投射 json对象。如果这样做,我不需要为测试数据定义一个构造函数,也不需要定义每个属性/函数。

let statTest = <Stat>({
    abbr: StatType.Con,
    score: 12,
    mod: 1
});

原始答案:

因此it turns out需要使用new()语法实际创建对象。但是由于TS缺少初始化程序列表,因此您必须创建一个显式构造函数,并手动提供所有参数。

所以我的课变成了:

export class Stat{
    abbr: StatType;
    score: number;
    mod: number;
    constructor(statType: StatType, score: number, mod: number){
        this.abbr = statType;
        this.score = score;
        this.mod = mod;
    }
    get name(): string { return StatType[this.abbr]; }
}

我的数组变成:

const stats: Stat[] = [
    new Stat(StatType.Str, 15, 2)
]

哦,好吧,当值来自实际服务器时,这并不重要。