2016-03-01 33 views
7

cách thích hợp để xử lý một tình huống mà bạn có hai giao diện có đủ tương tự mà bạn muốn chạy chúng thông qua cùng một mảnh của logic là gì:loại nguyên cảo Union: Đối phó với giao diện

interface DescriptionItem { 
    Description: string; 
    Code: string; 
} 
interface NamedItem { 
    Name: string; 
    Code: string; 
} 

function MyLogic(i: DescriptionItem | NamedItem) { 
    var desc = (<DescriptionItem>i).Description || (<NamedItem>i).Name; 

    return i.Code + ' - ' + desc; 
} 

này hoạt động; tuy nhiên, câu hỏi của tôi là cải thiện đường dây var desc = .... Là những gì tôi có trên các tùy chọn tốt nhất? Hoặc là có một cách tốt hơn để xử lý tình trạng này trong Typescript?

+0

tôi sẽ nói theo cách bạn đã làm nó có vẻ tốt đẹp. Tuy nhiên câu hỏi chính nó chủ yếu dựa trên ý kiến ​​và tôi sẽ bỏ phiếu để đóng nó trên cơ sở đó. :) – toskv

Trả lời

5

LoạiScript interfaces chỉ tồn tại ở thời gian biên dịch, vì vậy bạn không thể làm gì để kiểm tra các loại giao diện trong thời gian chạy. Mã bạn chỉ định trong câu hỏi của bạn có ý nghĩa và có lẽ là lựa chọn tốt nhất của bạn.

Tuy nhiên, nếu bạn có thể linh động thay đổi của bạn interfaces-classes, bạn có thể sử dụng bảo vệ loại nguyên cảo của để làm kiểm tra kiểu tao nhã hơn:

class DescriptionItem { 
    Description: string; 
    Code: string; 
} 
class NamedItem { 
    Name: string; 
    Code: string; 
} 

function MyLogic(i: DescriptionItem | NamedItem) { 
    let desc: string; 
    if (i instanceof DescriptionItem) { 
     desc = i.Description; 
    } else { 
     desc = i.Name; 
    } 

    return i.Code + ' - ' + desc; 
} 
+0

Tại sao bạn không thể kiểm tra nếu 'i.Name' tồn tại và phân biệt các loại dựa trên đó? – jocull

+0

@jocull Nếu đối tượng là một thể hiện của 'NamedItem', nhưng' Tên' của nó là 'undefined'? –

+0

Nếu thiếu dữ liệu không bắt buộc, đó có thực sự là một ví dụ của 'NamedItem' không? – jocull

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