web-dev-qa-db-fra.com

Angular2 & TypeScript: comment ajouter une méthode / prototype d'extension de chaîne

Je veux ajouter la méthode d'extension format() à String. Donc, je m'attends à ce que je puisse utiliser String.format N'importe où dans mon projet. J'avais suivi la ligne directrice de ce sujet mais cela n'aide pas. J'ai eu cette erreur: enter image description here

Quelqu'un peut-il m'aider?

Merci d'avance.

p.s: Je veux ajouter la méthode d'extension comme je l'ai fait dans angular 1.xx

enter image description here


Modifier

utiliser declare global n'obtiendra pas d'erreur.

declare global {
interface String {
    format(): string;
}}

String.prototype.format = function () :string {
var result = arguments[0];
for (var i = 0; i < arguments.length - 1; i++) {
    var reg = new RegExp("\\{" + i + "\\}", "gm");
    result = result.replace(reg, arguments[i + 1]);
}
return result;}

Comment nous utilisons String.format('<img alt="{0}" title="{0}" src="{1}" />', name, id); Puisque format ne nécessite pas de paramètres

15
jack.pop

Basé sur ce terrain de je cela fonctionne très bien.

Cela ne fonctionne probablement pas pour vous car vous utilisez probablement des modules (import/export), dans ce cas, vous devez le faire dans le augmentation globale :

declare global {
    interface String {
        foo(): number;
    }
}

Vous n'aurez alors aucune erreur lors de l'ajout de foo au prototype.


Éditer

Il semble que vous souhaitiez une fonction statique sur String, vous devez donc procéder comme suit:

declare global {
    interface StringConstructor {
        format(): string;
    }
}

String.format = function (...args: string[]) {
    ...
}

J'ai également ajouté le ...args: string[] à la signature qui indique au compilateur que la fonction attend un nombre quelconque de chaînes comme arguments.

7
Nitzan Tomer

Pour moi, ce qui suit a fonctionné dans un projet Angular 6 utilisant TypeScript 2.8.4.

Dans le fichier typings.d.ts, ajoutez:

interface String {
  format(...args: string[]): string;
}

Remarque: Pas besoin de "déclarer global".

Dans un nouveau fichier appelé string.extensions.ts, ajoutez ce qui suit:

interface String {
  format(...args: string[]): string;
}

String.prototype.format = function (...args: string[]): string {
  var s = this;
  return s.replace(/{(\d+)}/g, function (match, number) {
    return (typeof args[number] != 'undefined') ? args[number] : match;
  });
};

Pour l'utiliser, importez-le d'abord:

import '../../string.extensions';

Évidemment, votre déclaration d'importation doit pointer vers le bon chemin. Dans le constructeur de votre classe ou n'importe quelle méthode:

console.log("Hello {0}".format("world"));
6
Jacques