这感觉真是一个愚蠢的错误,但是我有一个打字稿课:
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
}
谢谢!
答案 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)
]
哦,好吧,当值来自实际服务器时,这并不重要。