2016-10-25 21 views
5

Hãy nói rằng chúng ta có ví dụ đơn giản này:nguyên cảo: loại an toàn cho tài sản giao diện trong phần khai báo hàm

interface Steps { 
    stepOne?: boolean; 
    stepTwo?: boolean; 
    stepThree?: boolean; 
} 

let steps: Steps = {}; 

function markStepDone (step: ???) { 
    steps[step] = true; 
} 


markStepDone('anything'); 

Làm thế nào tôi có thể ngăn chặn nó cho phép để vượt qua 'gì' để chức năng này và chỉ cho phép [ 'stepOne ',' stepTwo ',' stepThree ']?

Tôi cũng đã cố gắng để làm điều đó với enum, nhưng hóa ra là bạn không thể sử dụng enum như một chữ ký số ...

Trả lời

8

gì bạn đang tìm kiếm là keyof điều hành, hiện đang được thực hiện trong tuần này (Vâng thật đấy). Nó sẽ giống như thế này khi nó đã sẵn sàng:

function markStepDone (step: keyof Steps) { 
    steps[step] = true; 
} 

Một PR sớm với một tên khác nhau (keysof) là ở đây: https://github.com/Microsoft/TypeScript/pull/10425

Trong khi đó, string là một xấp xỉ thô, hoặc kiểu viết tay "stepOne" | "stepTwo" | "stepThree" sẽ cung cấp cho bạn hành vi chính xác của keyof Steps

+1

Cảm ơn bạn! Cho đến khi 'keyof' ra ngoài, tôi đã làm một cái gì đó như thế này: ' loại AllSteps = 'stepOne' | 'stepTwo' | 'bước thứ ba'; Giao diện Các bước { [chỉ mục: chuỗi]: boolean; } chức năng markStepDone (bước: AllSteps) {' – Sergey

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