2016-04-05 13 views
12

W moim projekcie angular2 staram się przedłużyć prototyp klasy string za pomocą maszynopisu. To jest mój kod:Metody rozszerzeń w maszynopisie (system)

interface String 
{ 
    startsWith(s:string); 
    contains(s:string); 
    containsOr(s1:string, s2:string); 
} 

String.prototype.startsWith = function (s:string):boolean { 
    return this.indexOf (s) === 0; 
} 
String.prototype.contains = function (s:string):boolean { 
    return this.indexOf(s) > 1; 
} 
String.prototype.containsOr = function (s1:string, s2:string):boolean { 
    return this.indexOf(s1) > 1 || this.indexOf (s2) > 1; 
} 

Z tym kodem to kompiluje projektów (również zawartość pomocy Visual Studio Code pomaga mi), ale w czasie wykonywania otrzymuję „zawiera nie jest zdefiniowana”.

Co robię źle?

Thanks a lot

PS: to jest mój tsconfig:

{ 
    "compilerOptions": { 
    "target": "es5", 
    "module": "system", 
    "moduleResolution": "node", 
    "sourceMap": true, 
    "emitDecoratorMetadata": true, 
    "experimentalDecorators": true, 
    "removeComments": false, 
    "noImplicitAny": false, 
    "outDir": "wwwroot/app/source/" 
    }, 
    "exclude": [ 
    "node_modules", 
    "bower_components", 
    "wwwroot", 
    "typings/main", 
    "typings/main.d.ts" 
    ] 
} 

EDIT

zauważyłem, że importując js plik index.html w działa ale nie podoba mi się to podejście.

<script src="app/source/utils/extensions.js"></script> 
+0

Czy importujesz swoje rozszerzenia? Jeśli używasz modułu ładującego moduły, musisz sprawdzić, czy napisany kod jest załadowany. –

+0

Dzięki Luka. Co masz na myśli z importem? Nie eksportuję klasy. Zaktualizowałem pytanie, podając więcej szczegółów. – user3471528

+0

W systemie System.js musisz podać kompilatorowi, gdzie można znaleźć kod. Podąża za wszystkimi importami i rozwiązuje je, ładując zawartość. W ten sposób możesz uniknąć umieszczania wszystkich plików js w tobie html. –

Odpowiedz

1

Zamiast importowania kodu w HTML wystarczy umieścić to na górze kodzie:

import './utils/extensions'; 

Wystarczy wymienić go na swojej ścieżce do pliku.

Oto kilka zasobów na moduły i importu:

TypeScript docs

MDN docs

+0

W ten sposób pojawia się następujący błąd: * http: // localhost: 2068/app/source/utils/extensions.js wykryty jako rejestr, ale nie został wykonany. (...) * – user3471528

+0

Czy możesz spróbować eksportować 'String' w twoje 'extensions.ts'? :) –

+0

Dodawanie pracy * eksportu * przed * interfejsem * Otrzymuję błąd kompilacji * błąd TS2339: Właściwość "zawiera" nie istnieje w typie "Łańcuch". app/source/utils/extensions.ts (15,18): błąd TS2339: Właściwość "containsOr" nie istnieje dla typu 'String'. * Dziwne jest to, że błąd jest związany z zawartością() i zawieraOr i nie uruchamiaWith()>. < – user3471528

15

udało mi się dostać pracę bez błędów TS (1.8.9), (2.0.0 Angular2 -beta.12) błędów i działa wywołanie funkcji za pomocą następującego szablonu:

tsconfig.json

{ 
    "compilerOptions": { 
    "target": "es5", 
    "module": "system", 
    "moduleResolution": "node", 
    "sourceMap": true, 
    "emitDecoratorMetadata": true, 
    "experimentalDecorators": true, 
    "removeComments": false, 
    "noImplicitAny": false 
}, 
"exclude": [ 
    "node_modules", 
    "typings/main", 
    "typings/main.d.ts" 
    ] 
} 

Następnie należy utworzyć (jeśli nie istnieje) a global.d.ts lokalnego pliku do projektu:

global.d.ts (lokalnej do projektu, a nie główny plik o tej samej nazwie TS)

export {} 

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

extensions.ts (cały plik)

export {} 

//don't redefine if it's already there 
if (!String.prototype.hasOwnProperty('calcWidth')) { 
    String.prototype.calcWidth = function(): number { 
     //width calculations go here, but for brevity just return length 
     return this.length; 
    } 
} 

Następnie w cokolwiek twój pierwszy plik System.import (nazwa pliku) to (moje jest main.ts).Wystarczy użyć raz:

import './extensions' //or whatever path is appropriate 
... 
... 

Teraz w całej aplikacji można użyć interfejsu:

var testString = 'fun test'; 
console.log(testString.calcWidth()); 

Wytwarza wyjścia konsoli:

8 

nadzieję, że to pomocne.

Powiązane problemy