Как сообщить компилятору 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();
Другие вопросы по тегам