2016-04-15 23 views
2

Kann ich die neuen ECMA6 Array-Methoden wie find() und includes() in Typescript verwenden? Sie scheinen zu arbeiten, trotz der Tatsache, dass der Compiler sagt:Verwenden Sie ECMA6 Array-Methoden in Typescript?

error TS2339: Property 'find' does not exist on type 'User[]'. 

The documentation impliziert, dass es funktionieren sollte, wenn sie sagt

Typoskript unterstützt neue Funktionen in JavaScript, wie die Unterstützung für klassenbasierte Objekt -orientierte Programmierung.

Warum gibt es mir einen Fehler?

+0

Welche Version von TypeScript? – Neal

+0

Kannst du auch etwas von deinem Code hinzufügen, damit wir sehen können, wie 'User []' definiert ist? – Neal

Antwort

2

Sie müssen sicherstellen, dass die target in tsconfig.json-"ES6" gesetzt:

"target": "ES6" // under "compilerOptions" 

Das wird es den definition file mit find(..) in Array<T> gefunden machen sind.

Beispiel

// test.ts 
var a: number[]; 

a.find(n => n === 3); 

Dann kompilieren:

tsc test.ts --target ES6 // ok 
tsc test.ts --target ES5 // error: Property 'find' does not exist on type 'number[]' 

Polyfill

Wenn Sie ES6 nicht ausrichten möchten und stattdessen eine polyfill verwenden, dann können Sie Fügen Sie dies zu einer Definitionsdatei hinzu, die von Ihrem Code verwendet werden soll:

interface Array<T> { 
    find(predicate: (value: T, index: number, obj: Array<T>) => boolean, thisArg?: any): T; 
} 
+0

Ihre Antwort * fast * beantwortet meine Frage - da ist etwas, was ich nicht verstehe. Ich dachte, Typescript wäre eine Obermenge (oder fast Obermenge) von ECMA6, die in ECMA5 kompiliert werden könnte. Sollte es nicht intrinsisch wissen, dass Arrays eine 'find()' Methode haben? Warum brauche ich eine Polyfill? –

+1

@IanPhillips es wird einen Fehler verursachen, da diese ES6 + -Methoden nicht immer in einer ES5-Umgebung existieren - wenn ES5 angreift. Der Compiler generiert den Code für diese Polyfills nicht, daher müssen Sie einen eigenen Code angeben und dann eine Definition für diese Polyfills angeben. Wenn Sie dagegen auf ES6 abzielen, wird der Compiler die Annahme machen, dass Sie den Code in einer ES6-Umgebung ausführen werden, in der diese Methoden existieren und daher kein Fehler auftritt. –

+0

Ich dachte, dass der Typescript-Compiler * genau * den Code für diese Polyfills generiert hat; Vieles von dem, was mich für Typescript begeisterte, war meine Überzeugung, dass ich Typoskript-Code schreiben und in Javascript kompilieren könnte, das auf beschissenen alten Browsern laufen würde. Und dennoch beweist ein kurzer Test, dass Sie Recht haben - Typescript gibt einen Fehler aus, wenn es auf ES5 abzielt, und lässt die Methode 'find()' so wie sie ist. –

Verwandte Themen