2016-11-06 59 views
1

我想爲外部庫增量添加聲明。是否可以編寫一個只描述某個對象/接口的某些屬性的聲明,而剩餘的屬性從聲明中省略並因此未被選中?有沒有類似Flow的不完整(部分)聲明?

例如:可以按照對象

const a = {foo: 8, bar: 9} 

已聲明描述只有一個屬性?

declare var a: any|{foo: number} // doesn't actually work 

預期的行爲是,如果在聲明中找到某個屬性,那麼該類型將被強制執行。所有未提及的屬性的類型被認爲是any

interface Iface { 
    foo: number; 
    [propName: string]: any; 
} 
+1

'{FOO:數}&Object'可能? – loganfsmyth

+1

'{foo:number,[key:string]:any}' – gcanti

回答

1
type PartialA = {foo:number, [key:string]: any} 
const a: PartialA = {foo: 1, bar: 2} 
console.log(a.bar) 

此選項比下列之一,因爲類型的已知屬性都onforced更安全的:

a.foo = 'a' // causes error 
// 6: a.foo = 'a' 
//   ^string. This type is incompatible with 
// 3: type PartialA = {foo:number, [key:string]: any} 
//      ^number 


打字稿使用額外的屬性表達解決了這個問題

type PartialB = {foo:number}&any 
const b: PartialB = {foo: 1, bar: 2} 
console.log(b.bar) 
b.foo = 'a' // Ok in Flow 

測試與流量v0.34.0

來源:@loganfsmyth@gcanti

+1

'{foo:number}&Object'或'{foo:number}&any'是不安全的:您可以編寫'b.foo =' a''和typechecks – gcanti

+0

@gcanti好點,謝謝。我擴大了答案。 – czerny