Как сообщить компилятору TypeScript о расширениях прототипа JS Array?
Я создал polyfill для массива JavaScript;
if (Array.prototype.remove !== 'function') {
Array.prototype.remove = function (value) {
var idx = this.indexOf(value);
if (idx !== -1) {
return this.splice(idx, 1);
}
return false;
};
}
Сейчас я обновляю исходный проект JavaScript до проекта TypeScript, и tsc жалуется на использование метода.remove:
class Archive {
documents: DocInfo[] = []; // <-- Array of class DocInfo
addDocument(document: DocInfo) {
...
}
deleteDocument(document: DocInfo) {
this.documents.remove(document);
^^^^^^
tsc complains here: TS2339:Property 'remove' does not exist on type 'DocInfo[]'
}
}
Как я могу рассказать ТСК об этом расширении?
Я попытался создать файл для печати, но безуспешно:
declare module 'Array' {
export function removeByAttr(propertyName: string, propertyValue: any);
}
Спасибо
2 ответа
Решение
Наборы должны быть расширены Array<T>
интерфейс:
interface Array<T> {
remove(item: T): boolean;
}
Расширить класс Array интерфейсом просто, вы можете попробовать что-то вроде этого:
interface Array<T> {
remove(o: T): Array<T>;
}
Array.prototype.remove = function (o) {
var idx = this.indexOf(o);
if (idx !== -1) {
return this.splice(idx, 1);
}
return this;
}
class DocInfo {
name: string ;
constructor(name) {
this.name = name;
}
}
class Archive {
documents: DocInfo[] = [];
addDocument(document: DocInfo) {
this.documents.push(document);
}
deleteDocument(document: DocInfo) {
this.documents.remove(document);
}
printDocuments() {
this.documents.forEach((item: DocInfo) => {
console.log(item.name);
});
}
}
const a = new Archive();
const _1 = new DocInfo('1');
const _2 = new DocInfo('2');
a.addDocument(_1);
a.addDocument(_2);
a.printDocuments();
a.deleteDocument(_1);
console.log('*********************');
a.printDocuments();
console.log('*********************');
a.addDocument(_1);
a.deleteDocument(_2);
a.printDocuments();