2017-06-04 24 views
2

的類型,比方說,我想創建一個接口來描述這種類型的對象:打字稿接口,執行額外的屬性

let myObj= { 
    "count": 3, 
    "key1": "foo", 
    "key2": "bar", 
    "key3": "baz" 
}; 

這些對象總是有類型號碼的屬性數量和性質的休息是字符串

如果我使用指數的簽名是這樣定義我的界面:

interface MyObect { 
    count: number; 
    [key: string]: string; 
} 

我得到了編譯器錯誤:

[ts] Property 'count' of type 'number' is not assignable to string index type 'string'. 

所以我定義它是這樣的:

interface MyObect { 
    count: number; 
    [key: string]: any; 
} 

但這一定義並不像presise。

是否有強制執行額外屬性類型的方法?

+2

你可以用'[key:string]:string | number' –

回答

2

我已經通過聯合類型實現了這樣的事情:

type MyObject = 
{ 
    count : number 
} & { 
    [key : string] : string 
} 

這工作(我用的打字稿2.3.2)爲消耗對象,如下

// x : MyObject 
const count : number = x.count; 
const foo : string = x.foo 

但正如所指出的那樣,該分配仍然失敗

const x : MyObject = { 
    count: 10, 
    foo: 'bar' 
} 

因此這可能僅在某些情況下才有用。

+0

謝謝你的提示, 我也想這樣做,但使用該方法的對象是不可能的定義,而不是任何鑄造,因爲這個定義說明count是數字和字符串女巫是不可能的。 :/ –

+0

我已經更新了我的答案;我看到你的問題,我有點誤解,現在承認。 – Oly

+0

你可以確信使用這種方法(使用與MyObject一樣的強制類型),它確實是使用類型安全的(只要你正確地創建它們),所以如果這些只是在一個地方創建的,是一個可以接受的妥協。 – Oly