diff --git a/packages/babel-generator/src/generators/flow.js b/packages/babel-generator/src/generators/flow.js index 30e0365f558c..e2ccd1c316e7 100644 --- a/packages/babel-generator/src/generators/flow.js +++ b/packages/babel-generator/src/generators/flow.js @@ -250,7 +250,12 @@ export function TypeParameterInstantiation(node: Object) { export { TypeParameterInstantiation as TypeParameterDeclaration }; export function ObjectTypeAnnotation(node: Object) { - this.token("{"); + if (node.exact) { + this.token("{|"); + } else { + this.token("{"); + } + let props = node.properties.concat(node.callProperties, node.indexers); if (props.length) { @@ -270,7 +275,11 @@ export function ObjectTypeAnnotation(node: Object) { this.space(); } - this.token("}"); + if (node.exact) { + this.token("|}"); + } else { + this.token("}"); + } } export function ObjectTypeCallProperty(node: Object) { diff --git a/packages/babel-generator/test/fixtures/flow/type-annotations/actual.js b/packages/babel-generator/test/fixtures/flow/type-annotations/actual.js index 3f158f8ff823..b7e3fca24663 100644 --- a/packages/babel-generator/test/fixtures/flow/type-annotations/actual.js +++ b/packages/babel-generator/test/fixtures/flow/type-annotations/actual.js @@ -102,3 +102,16 @@ export type { foo } from "bar"; export interface foo { p: number }; export interface foo { p: T }; var a: ?Array; +var a: {| numVal: number |}; +var a: {| numVal: number; |}; +var a: {| numVal: number; [indexer: string]: number |}; +var a: ?{| numVal: number |}; +var a: {| numVal: number; strVal: string |} +var a: {| subObj: {strVal: string} |} +var a: {| subObj: ?{strVal: string} |} +var a: {| param1: number; param2: string |} +var a: {| param1: number; param2?: string |} +var a: {| [a: number]: string; [b: number]: string; |}; +var a: {| add(x: number, ...y: Array): void |}; +var a: {| subtract: (x: number, ...y: Array) => void |}; +var a: {| id(x: T): T; |}; diff --git a/packages/babel-generator/test/fixtures/flow/type-annotations/expected.js b/packages/babel-generator/test/fixtures/flow/type-annotations/expected.js index 5c65efd5bf9c..1d2299742658 100644 --- a/packages/babel-generator/test/fixtures/flow/type-annotations/expected.js +++ b/packages/babel-generator/test/fixtures/flow/type-annotations/expected.js @@ -106,3 +106,16 @@ export type { foo } from "bar"; export interface foo { p: number }; export interface foo { p: T }; var a: ?Array; +var a: {| numVal: number |}; +var a: {| numVal: number |}; +var a: {| numVal: number; [indexer: string]: number; |}; +var a: ?{| numVal: number |}; +var a: {| numVal: number; strVal: string; |}; +var a: {| subObj: { strVal: string } |}; +var a: {| subObj: ?{ strVal: string } |}; +var a: {| param1: number; param2: string; |}; +var a: {| param1: number; param2?: string; |}; +var a: {| [a: number]: string; [b: number]: string; |}; +var a: {| add: (x: number, ...y: Array) => void |}; +var a: {| subtract: (x: number, ...y: Array) => void |}; +var a: {| id: (x: T) => T |};