2017-02-16 15 views
13

Giả sử tôi có loại luồng Suit và tôi muốn soạn nó thành một loại khác có tên là Card.Lưu lượng: Tự động tạo các loại liên kết chuỗi?

// types.js 

type Suit = 
    | "Diamonds" 
    | "Clubs" 
    | "Hearts" 
    | "Spades"; 


type Card = { 
    ... 
    suit: Suit, 
    ... 
} 

Thay vì cứng mã hóa trong các dây Suit trực tiếp trong suit.js, là nó có thể tự động tạo ra các loại Suit dựa trên JavaScript nguyên thủy (mảng)? Nói ...

// constants.js 

const SUITS = ['Diamonds', 'Clubs', 'Hearts', 'Spades']; 

Cách này có thể được định nghĩa chỉ một lần và bên trong cấu trúc JavaScript sẽ được sử dụng lại trong các phần khác của ứng dụng. Ví dụ, một thành phần khác trong ứng dụng mà cần truy cập vào tất cả các quần áo có sẵn:

// component.js 

SUITS.map((suit: Suit): void => { ... }); 
+0

Tôi không chắc chắn 100% nhưng tôi không nghĩ rằng luồng hiện có chức năng này. Tôi thường kết thúc viết các chuỗi ký tự hai lần (một lần dưới dạng một loại, một khi là một giá trị) nếu tôi cần làm những gì bạn đã mô tả. –

Trả lời

2

này là trong thực tế có thể sử dụng các loại tiện ích $Keys:

const SUITS = { 
    Diamonds: 'Diamonds', 
    Clubs: 'Clubs', 
    Hearts: 'Hearts', 
    Spades: 'Spades', 
}; 

type Suit = $Keys<typeof SUITS> 

const suit1 : Suit = 'Diamonds'; // OK 
const suit2 : Suit = 'Foo'; // Type error 

Lưu ý rằng ví dụ này, các giá trị trong SUITS không thực sự quan trọng, luồng sẽ xem xét các khóa trong SUITS. type Suit sẽ giống như loại công đoàn type Suit = 'Diamonds' | 'Clubs' | ...

+0

Có thể thực hiện điều này nếu SUITS được định nghĩa là một mảng không? (Vì các giá trị không có bất kỳ hiệu ứng nào nếu SUITS là một đối tượng) –

+0

Tôi đã thử điều đó, nhưng điều đó dường như không được hỗ trợ. Nó không lỗi nhưng tôi không thể tìm ra cách để nó hoạt động. Nhưng đó là một mức giá nhỏ để trả :) –

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