2016-04-05 23 views
12

Trong dự án angular2 của tôi, tôi đang cố gắng mở rộng nguyên mẫu của lớp chuỗi bằng cách sử dụng kiểu chữ. Đây là mã của tôi:Phương pháp mở rộng trong bản ghi số (hệ thống)

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

Với mã này, biên dịch dự án (cũng là nội dung hỗ trợ của Visual Studio Mã giúp tôi) nhưng tại thời gian chạy tôi nhận được một 'chứa không được định nghĩa'.

Tôi đang làm gì sai?

Thanks a lot

PS: đây là tsconfig tôi:

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

tôi nhận thấy rằng việc nhập các js tập tin trong index.html nó hoạt động, nhưng tôi không thích cách tiếp cận này.

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

Bạn đã nhập tiện ích mở rộng của mình chưa? Nếu bạn đang sử dụng bộ nạp mô-đun, bạn sẽ phải kiểm tra xem mã bạn đã viết có thực sự được tải hay không. –

+0

Cảm ơn Luka. Ý bạn là gì khi nhập? Tôi không xuất khẩu lớp học. Tôi đã cập nhật câu hỏi với nhiều chi tiết hơn – user3471528

+0

Tốt trong System.js, bạn sẽ cần phải thông báo cho trình biên dịch biết nơi tìm mã của bạn. Nó tuân theo tất cả các hàng nhập của bạn và giải quyết chúng, tải nội dung. Bằng cách đó bạn có thể tránh đặt tất cả các tệp js vào html của bạn. –

Trả lời

1

Thay vì nhập khẩu mã trong html chỉ cần đặt này ở phía trên cùng của mã của bạn:

import './utils/extensions'; 

Chỉ cần thay thế nó bằng con đường của bạn để các tập tin.

Dưới đây là một số tài nguyên thêm về module và nhập khẩu:

TypeScript docs

MDN docs

+0

Bằng cách này tôi nhận được lỗi sau: * http: // localhost: 2068/app/source/utils/extensions.js được phát hiện là đăng ký nhưng không thực thi. (…) * – user3471528

+0

Bạn có thể thử xuất 'Chuỗi' trong 'extensions.ts' của bạn? :) –

+0

Thêm * xuất * làm việc trước * giao diện * Tôi nhận được một lỗi biên dịch * lỗi TS2339: Thuộc tính 'contains' không tồn tại trên loại 'String'. ứng dụng/nguồn/utils/extensions.ts (15,18): lỗi TS2339: Thuộc tính 'containsOr' không tồn tại trên loại 'Chuỗi'. * Điều lạ là lỗi liên quan đến chứa() và containsOr , và không phải để startWith()>. < – user3471528

15

tôi đã có thể để có được nó làm việc không có TS lỗi (1.8.9), Angular2 (2.0.0 -beta.12) lỗi và cuộc gọi chức năng hoạt động sử dụng mẫu sau:

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

Tiếp theo, tạo (nếu không tồn tại) nộp global.d.ts địa phương để dự án của bạn:

global.d.ts (địa phương để dự án, chứ không phải chính tập tin TS của cùng một tên)

export {} 

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

extensions.ts (toàn bộ tập tin)

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

Sau đó, trong bất cứ điều gì bạn System.import đầu tiên của bạn (tên tệp) là (tôi là main.ts).Chỉ cần sử dụng một lần:

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

Bây giờ, trong suốt ứng dụng của bạn, bạn có thể sử dụng giao diện của bạn:

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

Tạo giao diện điều khiển đầu ra:

8 

Hy vọng điều này là hữu ích.

Các vấn đề liên quan