2016-04-05 27 views
12

Angular2 projemde, typescript kullanarak string dizisinin prototipini genişletmeye çalışıyorum. Bir 'tanımlı değil içeriyor' get proje derler Bu kod ileTypescript (sistem) uzantı yöntemleri (sistem)

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; 
} 

(ayrıca içerik Visual Studio Kanununun yardımcı bana yardım) ancak çalışma anında: Bu benim kodudur.

Neyi yanlış yapıyorum?

Çok teşekkürler

Not: Bu benim tsconfig geçerli:

{ 
    "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" 
    ] 
} 

DÜZENLEME

Ben js dosyasını içe index.html içinde çalıştığını fark, ama bu yaklaşımı sevmiyorum.

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

Uzantılarınızı içe aktardınız mı? Bir modül yükleyici kullanıyorsanız, yazdığınız kodun gerçekten yüklü olup olmadığını kontrol etmeniz gerekir. –

+0

Teşekkürler Luka. İthalatla ne demek istiyorsun? Dersi ihraç etmiyorum. Soruyu daha fazla detay ile güncelledim – user3471528

+0

Sistem.js'de, derleyicinize kodunuzu nerede bulacağınızı söylemeniz gerekecek. Tüm ithalatlarınızı takip eder ve içeriği yükler. Böylece tüm js dosyalarını html'ye eklemekten kurtulabilirsiniz. –

cevap

1

yerine html kodu ithal sadece kod üstündeki bu koyun:

import './utils/extensions'; 

Sadece dosyasına yolu ile değiştirin.

TypeScript docs

MDN docs

+0

Bu şekilde, aşağıdaki hatayı alıyorum: * http: // localhost: 2068/app/source/utils/extensions.js register olarak algılandı ancak çalıştırılmadı. (…) * – user3471528

+0

"String" ini dışa aktarmayı deneyebilir misiniz? 'extensions.ts'? :) –

+0

* export * work * * işleminden önce * bir derleme hatası alıyorum * hata TS2339: Property 'içerir', 'String' türünde yok. app/source/utils/extensions.ts (15,18): hata TS2339: Özellik 'includeOr', 'String' türünde yok. * Tuhaflık, hatanın içerdiği() ile ilgili olduğu ve includeOr ve değilWith()>. < – user3471528

15
Ben hiçbir TS hataları (1.8.9), Angular2 ile çalışan elde edebildi

(2.0.0:

İşte modülleri ve ithalatta daha fazla kaynak bulabilirsiniz -beta.12) hataları ve aşağıdaki şablonu kullanarak işlev çağrısını çalışma:

tsconfig.json

012 (Bir yoksa) Sonra, bir global.d.ts projenize yerel dosya oluşturmak
{ 
    "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" 
    ] 
} 

:

global.d.ts (yerel, aynı adı taşıyan değil ana TS dosyasını proje )

export {} 

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

extensions.ts (tüm dosya) senin ne de Sonra

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; 
    } 
} 

İlk System.import (dosya adı) (benim ana kaynaktır).Sadece bir kere kullanın:

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

Şimdi, uygulama geneline size arabirimini kullanabilirsiniz: Bu yararlıdır

8 

Hope:

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

konsol çıktısını üretir.