2015-07-22 14 views
6

Tôi muốn tạo giao diện cho đối tượng có loại nhất định cho thuộc tính được đặt tên cụ thể và loại khác cho tất cả các thuộc tính khác.Giao diện kiểu chữ với thuộc tính được đặt tên và thuộc tính chỉ mục tùy ý có kiểu khác nhau

Tôi làm cách nào để viết định nghĩa cho foo bên dưới?

let foo = { 
    size: 3, 
    a: 'foo', 
    b: 'bar', 
    c: 'baz' 
} 

Đây sẽ là cách tiếp cận trực quan của tôi:

interface Foo { 
    size: number; 
    [name: string]: string; 
} 

Tuy nhiên, nguyên cảo cố gắng áp dụng các định nghĩa chung để định nghĩa cụ thể và gây nên các lỗi sau:

error TS2411: Property 'size' of type 'number' is not assignable to string index type 'string'. 

Trả lời

4

Nếu không có quy định mỗi tài sản, đó là dự kiến, nhưng bạn có thể làm điều này:

interface Foo1 { 
    size: number; 
    [name: string]: string|number; 
} 

Tốt hơn sử dụng any.

4

Bạn có thể làm một cái gì đó như thế này (tôi không biết nếu nó sẽ làm việc ở TS v1.5):

interface Size { 
    size: number; 
} 

interface StringMap { 
    [name: string]: string; 
} 

type Foo = Size & StringMap; 
+0

Bạn cũng có thể nội tuyến này nếu bạn muốn (cũng không chắc chắn 100% về ts 1.5). loại Foo = {size: number} & {[name: string]: string}; – bingles

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