web-dev-qa-db-fra.com

TypeScript | Array.from | erreur TS2339: la propriété 'from' n'existe pas sur le type 'ArrayConstructor'

J'étais en train de googler, mais je ne trouve pas les informations sur quoi et comment ajouter à mon projet pour pouvoir utiliser des méthodes ES6 comme Array.from

__ EDIT: prototype supprimé du mot

17
Kania

Vous pouvez facilement étendre les types existants de la manière suivante:

interface Array {
    from(arrayLike: any, mapFn?, thisArg?): Array<any>;
}

Le problème ici est que cela va ajouter la fonction aux instances du tableau et non en tant que fonction statique comme vous le souhaitez.
Mais cela peut se faire comme suit:

interface ArrayConstructor {
    from(arrayLike: any, mapFn?, thisArg?): Array<any>;
}

Ensuite, vous devriez pouvoir utiliser Array.from.

Essayez-le sur Playground .


Modifier

Si vous avez besoin de polyfiller la mise en œuvre (car l'environnement dans lequel vous comptez vous lancer ne l'a pas), voici comment:

interface ArrayConstructor {
    from(arrayLike: any, mapFn?, thisArg?): Array<any>;
}

Array.from = function(arrayLike: any, mapFn?, thisArg?): Array<any> {
    // place code from MDN here
}

Le code polyfill dans MDN .


2e édition

Sur la base d'un commentaire, j'ajoute une version dactylographiée:

interface ArrayConstructor {
    from<T, U>(arrayLike: ArrayLike<T>, mapfn: (v: T, k: number) => U, thisArg?: any): Array<U>;
    from<T>(arrayLike: ArrayLike<T>): Array<T>;
}

C'est une copie exacte de la façon dont elle est définie dans lib.es6.d.ts .

10
Nitzan Tomer

Si vous êtes sûr que l'API existe sur votre moteur au moment de l'exécution, compilez-la avec --lib es6 (ou --lib dom, es6 si vous utilisez les API DOM).

voir Documentation sur les options du compilateur pour plus de détails.

11
mohamed hegazy

J'espère que ce n'est pas vraiment un sujet hors sujet, mais j'ai trouvé ceci lors du refactoring de js à ts, et si vous avez un tableau du genre, il semble fonctionner en passant simplement le tableau comme au constructeur au lieu d'utiliser from, supprimant ainsi le besoin de la méthode supplémentaire.

par exemple

// someScript.js

Array.from( arrayLikeThing );

devient

// someScript.ts

Array( arrayLikeThing );

S'il existe d'autres raisons de continuer à utiliser .from, les réponses ci-dessus sont excellentes.

0
Vincent Buscarello