Javascript Typescript:将方法添加到类的数组中

Javascript Typescript:将方法添加到类的数组中,javascript,typescript,class,model,Javascript,Typescript,Class,Model,假设我有一个文章模型,该模型有一个字段,其中包含不同语言的文章名称: class Article { constructor(public name: Translation[]) { } } class Translation { constructor( public language: string, public text: string ) { } } 我希望能够调用一个方法,将该文章名称转换为作为参数给出的语言: article.name.transl

假设我有一个文章模型,该模型有一个字段,其中包含不同语言的文章名称:

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

class Translation {
  constructor(
    public language: string,
    public text: string
  ) { }
}
我希望能够调用一个方法,将该文章名称转换为作为参数给出的语言:

article.name.translate('EN')

如何将该方法添加到翻译数组中?

在运行时,只有一个
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')
类文章{
构造函数(公共名称:Translation[]){}
}
课堂翻译{
建造师(
公共语言:字符串,
公共文本:字符串
) { }
}
接口数组{//这必须是一个模块的全局数组
翻译(this:Translation[],lang:string):string;
}
Array.prototype.translate=函数(lang){
var t=this.find(o=>o.language==lang);
返回t&t.text;
}
让文章=新文章([
]);
article.name.translate('EN')
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');
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');
V2:

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');
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');

您可能需要创建自定义集合,而不是
Translation[]
(可能是
TranslationCollection
。否则,创建一个getter,将
name
设置为私有或受保护。首先,我想创建一个集合,但我必须在其中定义一个属性,所以我必须执行类似于article.name.translations.translate('EN')的操作,不是吗?我该如何使用getter?我不能给它传递一个参数,可以吗?我考虑过这一点,但我看到的问题是,我的类比具有翻译属性的文章要多…我已经更新了一个可翻译属性,它进行翻译并保存翻译。V2工作,谢谢!问题是它更改了文章模型结构,添加了propTranslation属性。我使用此模型将其上载到具有特定结构的API,该结构将被破坏。@Pizzicato然后您必须向原始文章模型添加一个构造函数,以获取新的文章模型(具有TranslatableProperties)作为参数并转换所需内容。由于Translate只包含一种语言和文本属性,因此没有其他方法可以接触外部并在同一级别上搜索其他属性。好的,谢谢,@Perrier。我想我只需要制作一个
util.js
文件,在其中添加一个函数,该函数接收翻译数组和语言与文本属性返回正确的文本。您的建议太复杂,尽管是正确的!:-)它是有效的,但我认为@Perrier answer更好,因为可能存在名称空间冲突。@Pizzicato确信他的解决方案是合理的。问题非常具体,关于扩展数组,这就是我提供的,我没有想到其他方法来解决这个问题。这就是为什么我有时会在冲突问题上放弃答案的原因it’这只是因为我们能做到,并不意味着我们应该:——)是的,我同意!谢谢你,提香!