Typescript: добавить метод в массив класса - PullRequest
0 голосов
/ 03 сентября 2018

Допустим, у меня есть модель Article, в которой есть одно поле с названием статьи на разных языках:

class Article {
  constructor(public name: Translation[]) { }
}

class Translation {
  constructor(
    public language: string,
    public text: string
  ) { }
}

Я хотел бы иметь возможность вызывать метод для перевода названия этой статьи на язык, указанный в качестве аргумента:

article.name.translate('EN')

Как я могу добавить этот метод к этому массиву переводов?

Ответы [ 2 ]

0 голосов
/ 03 сентября 2018

V1

class Article {
    constructor(public name: Translation[]) { }

    public translate(language:string):string {
        return this.name.find(t=>t.language==language).text;
    }
}


class Translation {
    constructor(
        public language: string,
        public text: string
    ) { }
}

let a = new Article([
    new Translation('EN', 'Yes'),
    new Translation('DE', 'Ja')
]);
a.translate('EN');

V2:

class Article {
    constructor(public name: TranslatableProperty) { }
}

class TranslatableProperty {
    constructor(public propTranslation:Translation[]) { }   

    public translate(language:string):string {
        return this.propTranslation.find(t=>t.language==language).text;
    }

}

class Translation {
    constructor(
        public language: string,
        public text: string
    ) { }

}

let a = new Article(new TranslatableProperty([
    new Translation('EN', 'Yes'),
    new Translation('DE', 'Ja')
]));
a.name.translate('EN');
0 голосов
/ 03 сентября 2018

Во время выполнения существует только один класс Array, поэтому добавление метода для одного типа массива добавит его для всех типов, что может привести к конфликтам. При этом вы можете добавить метод только для одного типа массива Typescript, например

class Article {
    constructor(public name: Translation[]) { }
}

class Translation {
    constructor(
        public language: string,
        public text: string
    ) { }
}

interface Array<T> { // this has to be in global of în a module
    translate(this: Translation[], lang: string): string;
}

Array.prototype.translate = function (lang) {
    var t = this.find(o => o.language == lang);
    return t && t.text;

}

let article = new Article([

]);
article.name.translate('EN')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...