Đúc kiểu TypeScript hoặc JavaScript


185

Làm thế nào để xử lý việc truyền kiểu trong TypeScript hoặc Javascript?

Nói rằng tôi có mã TypeScript sau đây:

module Symbology { 

    export class SymbolFactory { 

        createStyle( symbolInfo : SymbolInfo) : any { 
            if (symbolInfo == null)
            {
                 return null;
            }

            if (symbolInfo.symbolShapeType === "marker") {      

                // how to cast to MarkerSymbolInfo          
                return this.createMarkerStyle((MarkerSymbolInfo) symbolInfo);
            }                                  
        }

        createMarkerStyle(markerSymbol : MarkerSymbolInfo ): any { 
            throw "createMarkerStyle not implemented";
        }              

    }
}

nơi SymbolInfolà một lớp cơ sở. Làm cách nào để xử lý typecasting từ SymbolInfođến MarkerSymbolInfotrong TypeScript hoặc Javascript?

Câu trả lời:


284

Bạn có thể chọn như thế này:

return this.createMarkerStyle(<MarkerSymbolInfo> symbolInfo);

Hoặc như thế này nếu bạn muốn tương thích với chế độ tsx:

return this.createMarkerStyle(symbolInfo as MarkerSymbolInfo);

Chỉ cần nhớ rằng đây là một cast thời gian biên dịch, và không phải là cast thời gian chạy.


10
Bây giờ, tôi thấy rằng trong tài liệu, được gọi là Xác nhận loại trong phần 4.13.
Klaus Nji

Câu trả lời này không còn cung cấp hình ảnh đầy đủ về xác nhận loại trong bản thảo, trong khi câu trả lời của Alex cho một bức tranh đầy đủ hơn và nên là câu trả lời được chấp nhận.
Kristoffer Dorph

@KristofferDorph Câu trả lời này là 4 tuổi. Tại thời điểm viết TypeScript là phiên bản 0.8.1, và do đó là câu trả lời chính xác tại thời điểm đó. Hỗ trợ JSX chỉ được bao gồm 3 năm sau đó.
cá heo

@blorkfish là đúng, nhưng đó là một thực hành tốt để theo dõi thời đại, vì vậy mọi người hỏi cùng một câu hỏi ngày hôm nay nhận được câu trả lời hiện tại, và không phải như 4 năm trước :-)
Kristoffer Dorph

160

Đây được gọi là xác nhận kiểu trong TypeScript và kể từ TypeScript 1.6, có hai cách để diễn đạt điều này:

// Original syntax
var markerSymbolInfo = <MarkerSymbolInfo> symbolInfo;

// Newer additional syntax
var markerSymbolInfo = symbolInfo as MarkerSymbolInfo;

Cả hai lựa chọn thay thế là giống nhau về chức năng . Lý do giới thiệu as-syntax là cú pháp ban đầu mâu thuẫn với JSX , xem phần thảo luận thiết kế tại đây .

Nếu bạn đang ở một vị trí để lựa chọn, chỉ cần sử dụng cú pháp mà bạn cảm thấy thoải mái hơn. Cá nhân tôi thích as-syntax vì nó cảm thấy trôi chảy hơn khi đọc và viết.


2
Làm thế nào để bạn chỉ ra bản thảo rằng bạn đã chuyển đổi một đối tượng sang loại khác? Ví dụ, một func trả về type2, bên trong nó http có loại 1, logic có chuyển đổi không và trả về kiểu 1 nhưng bây giờ là type2?
Tony Gutierrez

@TonyGutierrez Làm thế nào để bạn chuyển đổi?
Alex

1
Về cơ bản lấy một tài sản và sửa đổi. Cách duy nhất tôi đã tìm thấy để làm điều này là tạo một var (type2) mới và sao chép trong các đạo cụ từ type1var và sau đó trả lại nó. Bạn không thể sửa đổi loại 1 và trả lại hoặc bạn gặp lỗi "Không thể truyền".
Tony Gutierrez

1

Trong bản đánh máy, có thể thực hiện instanceofkiểm tra một câu lệnh if và bạn sẽ có quyền truy cập vào cùng một biến với các Typedthuộc tính.

Vì vậy, hãy nói MarkerSymbolInfocó một tài sản trên nó được gọi là marker. Bạn có thể làm như sau:

if (symbolInfo instanceof MarkerSymbol) {
    // access .marker here
    const marker = symbolInfo.marker
}

Đây là một mẹo nhỏ để lấy ví dụ của một biến sử dụng cùng một biến mà không cần gán lại nó cho một tên biến khác.

Kiểm tra hai tài nguyên này để biết thêm thông tin:

Ví dụ về TypeScript & JavaScript

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.