2016-07-08 17 views
12

tôi có một đối tượng mà tất cả các phím được chuỗi, một số giá trị là chuỗi và còn lại là các đối tượng trong mẫu đơn này:giao diện nguyên cảo cho các đối tượng với một số được biết đến và một số tên thuộc tính không rõ

var object = { 
    "fixedKey1": "something1", 
    "fixedKey2": "something2", 
    "unknownKey1": { 'param1': [1,2,3], 'param2': "some2", 'param3': 'some3'}, 
    "unknownKey2": { 'param1': [1,2,3], 'param2': "some2", 'param3': 'some3'}, 
    "unknownKey3": { 'param1': [1,2,3], 'param2': "some2", 'param3': 'some3'}, 
    ... 
    ... 
}; 

Trong này đối tượng fixedKey1fixedKey2 là các khóa đã biết sẽ có trong đối tượng đó. unknownKey - cặp giá trị có thể thay đổi từ 1-n.

tôi đã cố gắng xác định các giao diện của các đối tượng như:

interface IfcObject { 
    [keys: string]: { 
     param1: number[]; 
     param2: string; 
     param3: string; 
    } 
} 

Nhưng điều này ném các lỗi sau:

Variable of type number is not assignable of type object

Mà tôi phát hiện ra rằng nó không phải là có thể gán giao diện này để " cặp fixedKey - value ".

Vì vậy, làm cách nào để kiểm tra loại biến này?

Trả lời

8

Nó không chính xác những gì bạn muốn, nhưng bạn có thể sử dụng một union type:

interface IfcObject { 
    [key: string]: string | { 
     param1: number[]; 
     param2: string; 
     param3: string; 
    } 
} 
1

Như @Paleo giải thích bạn có thể sử dụng tài sản công đoàn để xác định một giao diện cho đối tượng tương ứng của bạn.

Tôi sẽ nói bạn nên xác định giao diện cho giá trị đối tượng và sau đó bạn nên xác định đối tượng ban đầu của mình.

Giao diện mẫu có thể

export interface IfcObjectValues { 
    param1: number[]; 
    param2: string; 
    param3: string;   
} 

export interface IfcMainObject { 
[key : string]: string | IfcObjectValues; 
} 
3

Các câu trả lời đúng cho câu hỏi này là:

export interface IfcObjectValues { 
    param1: number[]; 
    param2: string; 
    param3: string;   
} 

interface MyInterface { 
    fixedKey1: string, 
    fixedKey2: number, 
    [x: string]: IfcObjectValues, 
} 

Mã của bạn trong hành động, see here.

+0

Có, nó sẽ chính xác hơn, nhưng vẫn viết loại ** bất kỳ ** nào không phải là một thực hành tốt. –

+0

@yugantarkumar tốt bắt, tôi đã không nhận thấy rằng các phím còn lại tất cả đã đối tượng cùng loại, nhờ chỉnh sửa. – bersling

+0

Cảm ơn @bersling, Thật dễ dàng để tôi bắt được, vì tôi chỉ hỏi câu hỏi này. :) –

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