2015-09-25 16 views
23

Tôi có một số chức năng tiện ích. Cách tốt nhất để đóng gói những thứ này là gì và sau đó nhập chúng?Cách cấu trúc lớp tiện ích

Đây là những gì tôi đang cố gắng để làm:

import * as util from './util' 

export class myClass{ 
    constructor() 
    { 
      util.doSomething("test"); 
    } 
} 

Sau đó, trong lớp:

export class Util{ 
    doSomething(val: string){ return val;} 

    doSomethingElse(val: string{ return val;} 
} 

nhắn Các lỗi tôi nhận được từ VS là "tài sản doSomething không tồn tại trên loại util. "

Trả lời

38

Nếu bạn tạo một file utils.ts chứa

export default class Utils { 
    static doSomething(val: string) { return val; } 
    static doSomethingElse(val: string) { return val; } 
} 

sau đó bạn có thể đơn giản hóa mã khách hàng của bạn như thế này:

import Utils from './utils' 

export class MyClass { 
    constructor() 
    { 
     Utils.doSomething("test"); 
    } 
} 
+2

Đây là cách tôi thích làm ngay bây giờ. –

+0

Các phương pháp có phải là tĩnh không? Không thể một thể hiện của lớp Utils được tạo ra được sử dụng? – user728630

+1

@GregGum Bao bọc các chức năng không trạng thái của bạn trong một lớp chỉ vì nó là một ý tưởng tồi, bởi vì nó phá vỡ các kỹ thuật tối ưu hóa mô-đun như lắc cây. Bạn nên xuất mọi thứ càng gần với cấp cao nhất của mô-đun càng tốt. –

18

Có một vài vấn đề ở đây:

  1. Bạn không instantiating bất cứ điều gì, và doSomething là một phương pháp dụ
  2. Khi bạn làm import * as util, util đại diện cho mô-đun, không phải là một đối tượng trong đó.

Nếu bạn muốn Util, bạn chỉ nên nhập khẩu rằng:

import { Util } from './util' 

Tiếp theo, bạn nên nhanh chóng Util, trước khi cuối cùng đã gọi phương thức trên nó:

var u = new Util(); 
u.doSomething("test"); 

Dưới đây là mã của bạn vá lên:

import { Util } from './util' 

export class MyClass{ 
    constructor() 
    { 
     var u = new Util(); 
     u.doSomething("test"); 
    } 
} 

Tất cả những gì đã nói, dường như có điều gì đó kỳ lạ về cách bạn đang sử dụng utils của bạn. Đây là ý kiến ​​hoàn toàn cá nhân, nhưng tôi sẽ không gọi các phương thức "làm điều gì đó", tức là gây ra các tác dụng phụ, trong một nhà xây dựng.

Ngoài ra, các phương thức trong Util không thực sự giống như chúng cần ở trong lớp đó, vì lớp không giữ trạng thái mà chúng phụ thuộc vào. Bạn luôn có thể xuất các chức năng thông thường từ một mô-đun. Nếu bạn đã viết mô-đun utils của bạn như thế này:

export function doSomething(val: string) { return val; } 

export function doSomethingElse(val: string) { return val; } 

bạn sẽ xuất các chức năng của mình trực tiếp và sẽ tránh phiền phức instantiation, và trên thực tế mã ban đầu của bạn sẽ hoạt động chính xác.

+0

Cảm ơn bạn. Vâng, 'chức năng xuất khẩu ... 'là những gì tôi đang cố gắng làm. –

+0

Các mô-đun sử dụng không nên được khởi tạo như một thể hiện bằng từ khóa 'mới'. Nếu bạn muốn tuân thủ các quy ước tiêu chuẩn và giảm việc tạo ngữ cảnh thực thi, các phương thức lớp Util phải là các phương thức tĩnh, được truy cập thông qua 'Util.doSomething()' – Ryan

+0

@Ryan Bạn đang sai. Nếu chức năng bạn đang xuất khẩu phụ thuộc vào một số trạng thái, bạn nên xuất nó như là một lớp có thể khởi tạo. Nếu nó là không trạng thái, như trong trường hợp này, * bạn nên xuất khẩu nó như là xuất khẩu độc lập cấp cao nhất *. Nếu bạn chỉ nhồi nhét chúng vào một lớp học tĩnh không có lý do bạn phá vỡ cây lắc để không có lợi ích cho chính mình. –

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