2016-11-06 6 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 Flow

Кредит: @loganfsmyth, @gcanti

+1

'{foo: number} & Object' или' {foo: number} & any' небезопасны: вы можете написать 'b.foo = ' a'' и typechecks – gcanti

+0

@gcanti Хорошая точка, спасибо. Я продлил ответ. – czerny

 Смежные вопросы

  • Нет связанных вопросов^_^