From c641bbfad68e2e731a735fd5a4500fa6f63563b2 Mon Sep 17 00:00:00 2001 From: Lee Byron Date: Thu, 18 May 2017 16:06:42 +0200 Subject: [PATCH] Add void returns to constructors Fixes #857 This fixes an issue where flow implicitly types new Class as `any` if the constructor is not typed to return `void` (https://github.com/facebook/flow/issues/2748). --- src/language/source.js | 2 +- src/type/definition.js | 16 ++++++++-------- src/type/directives.js | 2 +- src/type/schema.js | 2 +- src/utilities/TypeInfo.js | 2 +- src/utilities/extendSchema.js | 4 ++-- .../rules/OverlappingFieldsCanBeMerged.js | 2 +- src/validation/validate.js | 6 +++++- 8 files changed, 20 insertions(+), 16 deletions(-) diff --git a/src/language/source.js b/src/language/source.js index a4af284636..274ecb6d7c 100644 --- a/src/language/source.js +++ b/src/language/source.js @@ -18,7 +18,7 @@ export class Source { body: string; name: string; - constructor(body: string, name?: string) { + constructor(body: string, name?: string): void { this.body = body; this.name = name || 'GraphQL'; } diff --git a/src/type/definition.js b/src/type/definition.js index 8c109e92c3..cbc7f35e2d 100644 --- a/src/type/definition.js +++ b/src/type/definition.js @@ -297,7 +297,7 @@ export class GraphQLScalarType { _scalarConfig: GraphQLScalarTypeConfig<*, *>; - constructor(config: GraphQLScalarTypeConfig<*, *>) { + constructor(config: GraphQLScalarTypeConfig<*, *>): void { assertValidName(config.name); this.name = config.name; this.description = config.description; @@ -417,7 +417,7 @@ export class GraphQLObjectType { _fields: GraphQLFieldMap<*, *>; _interfaces: Array; - constructor(config: GraphQLObjectTypeConfig<*, *>) { + constructor(config: GraphQLObjectTypeConfig<*, *>): void { assertValidName(config.name, config.isIntrospection); this.name = config.name; this.description = config.description; @@ -696,7 +696,7 @@ export class GraphQLInterfaceType { _typeConfig: GraphQLInterfaceTypeConfig<*, *>; _fields: GraphQLFieldMap<*, *>; - constructor(config: GraphQLInterfaceTypeConfig<*, *>) { + constructor(config: GraphQLInterfaceTypeConfig<*, *>): void { assertValidName(config.name); this.name = config.name; this.description = config.description; @@ -774,7 +774,7 @@ export class GraphQLUnionType { _types: Array; _possibleTypeNames: {[typeName: string]: boolean}; - constructor(config: GraphQLUnionTypeConfig<*, *>) { + constructor(config: GraphQLUnionTypeConfig<*, *>): void { assertValidName(config.name); this.name = config.name; this.description = config.description; @@ -888,7 +888,7 @@ export class GraphQLEnumType/* */ { _valueLookup: Map; _nameLookup: { [valueName: string]: GraphQLEnumValue }; - constructor(config: GraphQLEnumTypeConfig/* */) { + constructor(config: GraphQLEnumTypeConfig/* */): void { this.name = config.name; assertValidName(config.name, config.isIntrospection); this.description = config.description; @@ -1067,7 +1067,7 @@ export class GraphQLInputObjectType { _typeConfig: GraphQLInputObjectTypeConfig; _fields: GraphQLInputFieldMap; - constructor(config: GraphQLInputObjectTypeConfig) { + constructor(config: GraphQLInputObjectTypeConfig): void { assertValidName(config.name); this.name = config.name; this.description = config.description; @@ -1176,7 +1176,7 @@ export type GraphQLInputFieldMap = { export class GraphQLList { ofType: T; - constructor(type: T) { + constructor(type: T): void { invariant( isType(type), `Can only create List of a GraphQLType but got: ${String(type)}.` @@ -1221,7 +1221,7 @@ GraphQLList.prototype.toJSON = export class GraphQLNonNull { ofType: T; - constructor(type: T) { + constructor(type: T): void { invariant( isType(type) && !(type instanceof GraphQLNonNull), 'Can only create NonNull of a Nullable GraphQLType but got: ' + diff --git a/src/type/directives.js b/src/type/directives.js index cd8a39a2c8..bc2feff27c 100644 --- a/src/type/directives.js +++ b/src/type/directives.js @@ -53,7 +53,7 @@ export class GraphQLDirective { locations: Array; args: Array; - constructor(config: GraphQLDirectiveConfig) { + constructor(config: GraphQLDirectiveConfig): void { invariant(config.name, 'Directive must be named.'); assertValidName(config.name); invariant( diff --git a/src/type/schema.js b/src/type/schema.js index 8653187cfc..45c5cb5988 100644 --- a/src/type/schema.js +++ b/src/type/schema.js @@ -65,7 +65,7 @@ export class GraphQLSchema { [abstractName: string]: { [possibleName: string]: boolean } }; - constructor(config: GraphQLSchemaConfig) { + constructor(config: GraphQLSchemaConfig): void { invariant( typeof config === 'object', 'Must provide configuration object.' diff --git a/src/utilities/TypeInfo.js b/src/utilities/TypeInfo.js index 9805300bf9..193c0c13e9 100644 --- a/src/utilities/TypeInfo.js +++ b/src/utilities/TypeInfo.js @@ -64,7 +64,7 @@ export class TypeInfo { // to support non-spec-compliant codebases. You should never need to use it. // It may disappear in the future. getFieldDefFn?: typeof getFieldDef - ) { + ): void { this._schema = schema; this._typeStack = []; this._parentTypeStack = []; diff --git a/src/utilities/extendSchema.js b/src/utilities/extendSchema.js index b9d72205b6..02c42453b8 100644 --- a/src/utilities/extendSchema.js +++ b/src/utilities/extendSchema.js @@ -441,10 +441,10 @@ export function extendSchema( function extendFieldType(typeDef: T): T { if (typeDef instanceof GraphQLList) { - return new GraphQLList(extendFieldType(typeDef.ofType)); + return (new GraphQLList(extendFieldType(typeDef.ofType)): any); } if (typeDef instanceof GraphQLNonNull) { - return new GraphQLNonNull(extendFieldType(typeDef.ofType)); + return (new GraphQLNonNull(extendFieldType(typeDef.ofType)): any); } return getTypeFromDef(typeDef); } diff --git a/src/validation/rules/OverlappingFieldsCanBeMerged.js b/src/validation/rules/OverlappingFieldsCanBeMerged.js index 7a5faf7173..fd7fc92c27 100644 --- a/src/validation/rules/OverlappingFieldsCanBeMerged.js +++ b/src/validation/rules/OverlappingFieldsCanBeMerged.js @@ -776,7 +776,7 @@ function subfieldConflicts( class PairSet { _data: {[a: string]: {[b: string]: boolean}}; - constructor() { + constructor(): void { this._data = Object.create(null); } diff --git a/src/validation/validate.js b/src/validation/validate.js index 6b521af6c5..a13a53a2f1 100644 --- a/src/validation/validate.js +++ b/src/validation/validate.js @@ -111,7 +111,11 @@ export class ValidationContext { _variableUsages: Map>; _recursiveVariableUsages: Map>; - constructor(schema: GraphQLSchema, ast: DocumentNode, typeInfo: TypeInfo) { + constructor( + schema: GraphQLSchema, + ast: DocumentNode, + typeInfo: TypeInfo + ): void { this._schema = schema; this._ast = ast; this._typeInfo = typeInfo;