2016-07-22 15 views
8

Tôi đang viết chương trình bằng cách sử dụng kiểu chữ và tslint dưới dạng linter. danh sách yêu thích hiện tại của tôi là các quy tắc sau đây (tslint.json):Cách kiểm tra số tham số sai được chuyển đến hàm

{ 
    "extends": "tslint:recommended", 

    "rules": { 
     "comment-format": [false, "check-space"], 
     "eofline": false, 
     "triple-equals": [false, "allow-null-check"], 
     "no-trailing-whitespace": false, 
     "one-line": false, 
     "no-empty": false, 
     "typedef-whitespace": false, 
     "whitespace": false, 
     "radix": false, 
     "no-consecutive-blank-lines": false, 
     "no-console": false, 
     "typedef": [true, 
      "variable-declaration", 
      "call-signature", 
      "parameter", 
      "property-declaration", 
      "member-variable-declaration" 
     ], 
     "quotemark": false, 
     "no-any": true, 
     "one-variable-per-declaration": false 
    } 

} 

Mặc dù tôi đang sử dụng Tslint nó không thành công để bắt một sự kêu gọi đến một hàm với sai số thông số. Ví dụ tôi có chức năng sau:

let displayTimer: Function = function(): void { 
    document.getElementById('milliseconds').innerHTML = ms.toString(); 
    document.getElementById('seconds').innerHTML = seconds.toString(); 
    document.getElementById('minutes').innerHTML= minutes.toString(); 
}; 

Và tôi gọi nó bằng từ bên trong một chức năng như thế này:

let turnTimerOn: Function = function(): void { 

    ms += interval; 

    if (ms >= 1000) 
    { 
     ms = 0; 
     seconds += 1; 
    } 

    if (seconds >= 60) 
    { 
     ms = 0; 
     seconds = 0; 
     minutes += 1; 
    } 

    displayTimer(1); 
}; 

Như bạn có thể nhìn thấy tôi đi qua một tham số cho hàm displayTimer (trong trường hợp này số 1 nhưng nó có thể là bất cứ điều gì khác) và linter không bắt được điều đó.

+0

tốt, đó là vì nó không phải là javascript không hợp lệ. nó là hoàn toàn hợp lệ để vượt qua các giá trị mà bạn đã không được định nghĩa là các tham số và sau đó lấy chúng trong hàm bằng cách sử dụng các đối số ** **. – toskv

+0

Cảm ơn bạn đã chỉ ra điều này.Tôi đang đến từ nền Java/C# nên tôi muốn có thể kiểm tra loại không phù hợp này.Bất cứ ý tưởng nào? – skiabox

+0

Có lẽ tôi đang thiếu một cái gì đó nhưng có một lý do chức năng không được khai báo là 'function displayTimer(): void {'? Tôi nghĩ TS sẽ tốt hơn để kiểm tra điều đó. Ngay bây giờ tất cả nó đang làm việc cho việc gõ là 'let displayTimer: Function = ???'. Nó không biết liệu tại một số điểm bạn sẽ gán lại null hoặc một số chức năng khác cho nó. – Katana314

Trả lời

5

Chỉ cần loại bỏ các loại Function và nguyên cảo sẽ kiểm tra chữ ký:

let displayTimer = function(): void { 
    // ... 
}; 

displayTimer(1); // Error: Supplied parameters does not match any signature of call target 

Loại suy ra của displayTimer không phải là Function (mà chấp nhận bất kỳ chữ ký) nhưng () => void.

Xem the code in the PlayGround.

+0

Cảm ơn câu trả lời của bạn.Bạn đã đúng về trình biên dịch bản ghi phát hiện lỗi khi tôi loại bỏ khai báo kiểu hàm. Vấn đề là với các quy tắc tslint này ngay sau khi tôi loại bỏ khai báo, tôi thấy rằng tslint phàn nàn về việc loại bỏ này (TSLint : mong đợi biến khai báo: 'displayTimer' để có typedef (typedef)) – skiabox

+0

Theo gợi ý của bạn, tôi đã sử dụng đoạn mã sau để khai báo và gán một giá trị trong cùng một dòng. Nó có một chút xấu xí nhưng nó hoạt động: 'let displayTimer :() => void = function(): void { document.getElementById ('mili giây'). innerHTML = ms.toString(); document.getElementById ('giây'). InnerHTML = seconds.toString(); document.getElementById ('phút'). InnerHTML = minutes.toString(); }; ' – skiabox

+0

@skiabox IMO, bạn nên sử dụng suy luận nơi có thể sử dụng nó. 'let displayTimer:() => void = function(): void {/ * ... * /}' không phải là DRY. – Paleo

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