typescript - Sınıftaki soyut özelliğe yapıcı içinde erişilemez
Aşağıdaki örnekte, TypeScript hatası alıyorum: Abstract property 'name' in class 'Minigame' cannot be accessed in the constructor.
Bunu nasıl uygulayabileceğimi düşünmekte zorlanıyorum. super() çağrısına somut sınıfın adını geçiremiyorum çünkü bu çağrıdan önce nesnenin özelliklerine erişemem, ve özellikleri static yapamıyorum çünkü soyut sınıf bunu zorunlu kılamaz.
Her Minigame nesnesinin, somut sınıfın name özelliğini gerektiren bir Explanation nesnesi örneklendirmesini garanti etmek için bu nasıl organize edilmelidir? İsmi static yapmak (ve soyut gerekliliği kaldırmak) gerçekten bunu basit tutmak için en iyi seçeneğim mi?
abstract class Minigame {
abstract name: string;
explanation: Explanation;
constructor() {
this.explanation = new Explanation(this.name);
}
}
class SomeGame extends Minigame {
name = "Some Game's Name";
constructor() {
super();
}
}
Cevap #1
Bir dize için biraz çirkin, ama şunu yapabilirsin:
abstract class Minigame {
abstract GetName(): string;
explanation: Explanation;
constructor() {
this.explanation = new Explanation(this.GetName());
}
}
class SomeGame extends Minigame {
GetName(): string {
return "Some Game's Name";
}
constructor() {
super();
}
}
Cevap #2
İşte Tom Coton'a dayalı başka bir çözüm, getName yöntemini uygulamaya zorlamaz.
Sadece soyut sınıfta name'i yapıcı argümanı olarak taşıyorum.
class Explanation {
name: string;
constructor(name: string) {
this.name = name;
}
}
abstract class Minigame {
explanation: Explanation;
name: string;
constructor(name) {
this.name = name;
this.explanation = new Explanation(this.name);
}
}
class SomeGame extends Minigame {
constructor() {
super('some game')
}
}
const game = new SomeGame();
console.log({ game: game })
Burada "Çalıştır"a tıklayarak kontrol edebilirsiniz
https://www.typescriptlang.org/play?#code/MYGwhgzhAECiAeAHcA7MAXAlgexdA3gLABQ0Z0aAtgKYBc0E6ATpigOYDcJ50wujTAK7B02JgAoqdBs1ZsAlAW49y6ABaYIAOinQAvBTA0upcgF8SF4iTAAjAWBG9wUaAFlWmNkepLTZaiRUDBwUegRkMDQsXA5yZTIpegE5Ex4+FAFhUQkkmRZ2RXxoBJV1TR0ffUNjUp5y7UDI6NDqlGoAdzggqJDccQbKmnk080sS62JQSBgAZWwaAHEqwPRqFAATGA8ULyri0oyskTFxIrryCEFEagkAcggF328aO-lSqysSI-RoF98DO0uvMlj4ziZvvxsCBqFoQNg2OJiv96P9oGZ5EA
Her name ayarlandığında Explanation'ı yeniden oluşturmanız gerekirse, ek olarak setter ve getter kullanabilirsiniz:
class Explanation {
name: string;
constructor(name: string) {
this.name = name;
}
}
abstract class Minigame {
explanation?: Explanation;
private _name?: string;
set name(name: string | undefined) {
this._name = name;
if(name) {
this.explanation = new Explanation(name);
}
}
get name(): string | undefined{
return this._name;
}
constructor(name?: string) {
this.name = name;
}
}
class SomeGame extends Minigame {
constructor() {
super('some game');
}
}
const game = new SomeGame();
console.log({ game: game })
https://www.typescriptlang.org/play?#code/MYGwhgzhAECiAeAHcA7MAXAlgexdA3gLABQ0Z0aAtgKYBc0E6ATpigOYDcJ50wujTAK7B02JgAoqdBs1ZsAlAW49y6ABaYIAOinQAvBTA0upcgF8SF4iTAAjAWBG9wUaAFlWmNkepLTZaiRUDBwUAH56BGQwNCxcDnJlMkQWADcMXwB9KQiZFnYTJIZqdEMaSR96ATloAB9oQRQAE2oAM1ZqJsUifxV1TS1sn30y6hMVckxWippuor6NbUDo2NCRimoAdzggmJDcGep5cYnoKx4rIrYS0fF5Ktl2Oobmto6mntPoJhLBJjx+tohsYipdenwUAJhKIJDkHvkFH4voCdMMDFITmQrGZoCQSKBIDAAMrYGgAcWGgXQ1GaMA8KC8w3wuOs4P4zGhYjuSNOEEEiGoEgA5BBSb5vDQhcdQXjiGCIYxoBLfOittASeSfHdCsQFdgQNQtCBsGxxMzlfRlWd5EA
