2015-03-03 38 views
5

Làm việc với các nguyên cảo 1,4 Tôi đang gặp lỗi hài hước trên các dòng mã sau:ngày biên soạn nguyên cảo loại lỗi

var dateFrom:Date; 
var dateTo:Date; 
if(typeof discount.dateFrom === "string"){ 
    dateFrom = new Date(discount.dateFrom); // Line 362 
} else { 
    dateFrom = discount.dateFrom; 
} 

if(typeof discount.dateTo === "string"){ 
    dateTo = new Date(<string>discount.dateTo); // Line 368 
} else { 
    dateTo = discount.dateTo; 
} 

Các transpiler trả về như sau:

[FULL_PATH]/Quotation.ts(362,37): error TS2345: Argument of type 'Date' is not assignable to parameter of type 'string'. 
[FULL_PATH]/Quotation.ts(368,35): error TS2352: Neither type 'Date' nor type 'string' is assignable to the other. 

Sự khác biệt từ dòng 362 và 368 là hai trường hợp tôi đã cố khắc phục sự cố.

Tôi đã sử dụng mánh lới quảng cáo này ở vị trí khác trong mã và hoạt động tốt.

tôi bao gồm định nghĩa của các nhà xây dựng ngày từ lib.d.ts để tham khảo:

new(): Date; 
new (value: number): Date; 
new (value: string): Date; 
new (year: number, month: number, date?: number, hours?: number, minutes?: number, seconds?: number, ms?: number): Date; 
(): string; 
+0

Lỗi trong dòng # 362 có vẻ hiển nhiên ... đối số hàm tạo mong đợi một 'chuỗi' hoặc' số', nhưng bạn đang chuyển nó một 'Ngày' khác. Trừ khi 'discount.dateFrom' không giống với biến được khai báo ở trên cùng? – danludwig

+0

@danludwig Tôi đoán là dòng 368 nên khắc phục sự cố –

+0

Vấn đề với dòng # 368 là không có chuyển đổi nào được biết từ 'Ngày' thành' chuỗi'. Nó giống như kiểu chữ cho bạn biết đó là một dàn diễn viên không hợp lệ. Nếu có thể cho kiểu thời gian chạy 'discount.dateFrom' hoặc' discount.dateTo' thành 'string', thì bạn nên khai báo chúng là' any' thay vì 'Date'. – danludwig

Trả lời

2

Giả sử discount.dateFrom là loại công đoàn chẳng hạn như string|Date, có vẻ như bạn đang cố sử dụng trình bảo vệ loại trên thuộc tính của đối tượng chứ không phải trên biến cục bộ. Đó là không được hỗ trợ:

if (typeof discount.dateFrom === "string") { 
    // This doesn't change the type of discount.dateFrom 
} 

Tuy nhiên, nếu bạn viết:

var dateFromProp = discount.dateFrom; 
if (typeof dateFromProp === "string") { 
    // dateFromProp is a string in this scope 
} 

Sau đó nên làm việc.

+0

Thú vị, tôi không biết bạn có thể làm điều này. Vậy đây có phải là "loại hình công đoàn" không? 'dateFromProp' không có kiểu được suy ra từ kiểu' discount.dateFrom'? Phiên bản TS nào đã giới thiệu các loại công đoàn, hoặc họ đã giấu chúng ở đó? – danludwig

+2

@danludwig loại hình công đoàn được giới thiệu trong 1.4 http://blogs.msdn.com/b/typescript/archive/2014/11/18/what-s-new-in-the-typescript-type-system.aspx –

0

Nhờ @danludwig các chuyển đổi được biết đến date-string.toString()

if(typeof discount.dateTo === "string"){ 
    dateTo = new Date(discount.dateTo.toString()); 
} else { 
    dateTo = discount.dateTo; 
} 
+0

Vấn đề với điều này là nếu 'typeof discount.dateTo === 'string'', bạn không cần phải gọi' .toString() 'trên đó. Nếu có thể cho 'discount.dateTo' thành' string' hoặc 'Date', thì nó sẽ được khai báo là' any'. – danludwig

+0

@danludwig - hoặc một loại công đoàn, trong trường hợp đó mã OP có thể được cố định để được gõ hoàn toàn tĩnh mà không cần đến 'bất kỳ'. –