diff --git a/.eslintrc.js b/.eslintrc.js index 307b3d927be3..e97b295635ac 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -20,6 +20,7 @@ module.exports = { parser: '@typescript-eslint/parser', plugins: ['@typescript-eslint/eslint-plugin'], rules: { + '@typescript-eslint/array-type': ['error', 'generic'], '@typescript-eslint/no-unused-vars': [ 'error', {argsIgnorePattern: '^_'}, diff --git a/packages/expect/src/spyMatchers.ts b/packages/expect/src/spyMatchers.ts index 60e5606d6a6a..3fafa1175029 100644 --- a/packages/expect/src/spyMatchers.ts +++ b/packages/expect/src/spyMatchers.ts @@ -488,7 +488,7 @@ const ensureMock = (mockOrSpy: any, matcherName: any) => { }; const getPrintedCalls = ( - calls: any[], + calls: Array, limit: number, sep: string, fn: Function, @@ -503,7 +503,7 @@ const getPrintedCalls = ( return result.join(sep); }; -const getPrintedReturnValues = (calls: any[], limit: number): string => { +const getPrintedReturnValues = (calls: Array, limit: number): string => { const result = []; for (let i = 0; i < calls.length && i < limit; i += 1) { diff --git a/packages/jest-changed-files/src/index.ts b/packages/jest-changed-files/src/index.ts index b53f80db208f..9d31072168e6 100644 --- a/packages/jest-changed-files/src/index.ts +++ b/packages/jest-changed-files/src/index.ts @@ -27,7 +27,7 @@ const findGitRoot = (dir: string) => mutex(() => git.getRoot(dir)); const findHgRoot = (dir: string) => mutex(() => hg.getRoot(dir)); export const getChangedFilesForRoots = async ( - roots: Config.Path[], + roots: Array, options: Options, ): ChangedFilesPromise => { const repos = await findRepos(roots); @@ -55,15 +55,15 @@ export const getChangedFilesForRoots = async ( return {changedFiles, repos}; }; -export const findRepos = async (roots: Config.Path[]): Promise => { +export const findRepos = async (roots: Array): Promise => { const gitRepos = await Promise.all( - roots.reduce( + roots.reduce>( (promises, root) => promises.concat(findGitRoot(root)), [], ), ); const hgRepos = await Promise.all( - roots.reduce( + roots.reduce>( (promises, root) => promises.concat(findHgRoot(root)), [], ), diff --git a/packages/jest-config/src/normalize.ts b/packages/jest-config/src/normalize.ts index 7bf9f8a531fa..d1ed515126a3 100644 --- a/packages/jest-config/src/normalize.ts +++ b/packages/jest-config/src/normalize.ts @@ -173,7 +173,7 @@ const normalizeCollectCoverageOnlyFrom = ( key: keyof Pick, ) => { const initialCollectCoverageFrom = options[key]; - const collectCoverageOnlyFrom: Config.Glob[] = Array.isArray( + const collectCoverageOnlyFrom: Array = Array.isArray( initialCollectCoverageFrom, ) ? initialCollectCoverageFrom // passed from argv @@ -194,7 +194,7 @@ const normalizeCollectCoverageFrom = ( key: keyof Pick, ) => { const initialCollectCoverageFrom = options[key]; - let value: Config.Glob[] | undefined; + let value: Array | undefined; if (!initialCollectCoverageFrom) { value = []; } diff --git a/packages/jest-diff/src/diffStrings.ts b/packages/jest-diff/src/diffStrings.ts index b71259c40485..6d8fba1533fb 100644 --- a/packages/jest-diff/src/diffStrings.ts +++ b/packages/jest-diff/src/diffStrings.ts @@ -128,7 +128,7 @@ const diffExpand = ( const isCommon: Callbacks['isCommon'] = (aIndex, bIndex) => aLinesUn[aIndex] === bLinesUn[bIndex]; - const array: string[] = []; + const array: Array = []; const put = (line: string) => { array.push(line); }; diff --git a/packages/jest-docblock/src/index.ts b/packages/jest-docblock/src/index.ts index 892a8a32cac3..5bbb279feb0b 100644 --- a/packages/jest-docblock/src/index.ts +++ b/packages/jest-docblock/src/index.ts @@ -8,7 +8,7 @@ import {EOL} from 'os'; import detectNewline from 'detect-newline'; -type Pragmas = {[key: string]: string | string[]}; +type Pragmas = {[key: string]: string | Array}; const commentEndRe = /\*\/$/; const commentStartRe = /^\/\*\*/; @@ -65,7 +65,10 @@ export function parseWithComments( typeof result[match[1]] === 'string' || Array.isArray(result[match[1]]) ) { - result[match[1]] = ([] as string[]).concat(result[match[1]], nextPragma); + result[match[1]] = ([] as Array).concat( + result[match[1]], + nextPragma, + ); } else { result[match[1]] = nextPragma; } @@ -119,8 +122,8 @@ export function print({ ); } -function printKeyValues(key: string, valueOrArray: string | string[]) { - return ([] as string[]) +function printKeyValues(key: string, valueOrArray: string | Array) { + return ([] as Array) .concat(valueOrArray) .map(value => `@${key} ${value}`.trim()); } diff --git a/packages/jest-message-util/src/index.ts b/packages/jest-message-util/src/index.ts index f1c6ad699215..6535e8e7fee9 100644 --- a/packages/jest-message-util/src/index.ts +++ b/packages/jest-message-util/src/index.ts @@ -26,7 +26,7 @@ const stackUtils = new StackUtils({ cwd: 'something which does not exist', }); -let nodeInternals: RegExp[] = []; +let nodeInternals: Array = []; try { nodeInternals = StackUtils.nodeInternals(); @@ -151,9 +151,9 @@ export const formatExecError = ( }; const removeInternalStackEntries = ( - lines: string[], + lines: Array, options: StackTraceOptions, -): string[] => { +): Array => { let pathCounter = 0; return lines.filter(line => { @@ -230,7 +230,7 @@ export const getStackTraceLines = ( options: StackTraceOptions = {noStackTrace: false}, ) => removeInternalStackEntries(stack.split(/\n/), options); -export const getTopFrame = (lines: string[]): Frame | null => { +export const getTopFrame = (lines: Array): Frame | null => { for (const line of lines) { if (line.includes(PATH_NODE_MODULES) || line.includes(PATH_JEST_PACKAGES)) { continue; diff --git a/packages/jest-mock/src/index.ts b/packages/jest-mock/src/index.ts index a23a49d2fe36..b39c2b9f7ed9 100644 --- a/packages/jest-mock/src/index.ts +++ b/packages/jest-mock/src/index.ts @@ -21,7 +21,7 @@ namespace JestMock { export type MockFunctionMetadata< T, - Y extends unknown[], + Y extends Array, Type = MockFunctionMetadataType > = { ref?: number; @@ -60,7 +60,7 @@ type MockFunctionResult = { value: unknown; }; -type MockFunctionState = { +type MockFunctionState> = { calls: Array; instances: Array; invocationCallOrder: Array; @@ -81,24 +81,24 @@ type MockFunctionConfig = { // see https://github.com/Microsoft/TypeScript/issues/25215 type NonFunctionPropertyNames = { - [K in keyof T]: T[K] extends (...args: any[]) => any ? never : K + [K in keyof T]: T[K] extends (...args: Array) => any ? never : K }[keyof T] & string; type FunctionPropertyNames = { - [K in keyof T]: T[K] extends (...args: any[]) => any ? K : never + [K in keyof T]: T[K] extends (...args: Array) => any ? K : never }[keyof T] & string; -interface Mock +interface Mock = Array> extends Function, MockInstance { new (...args: Y): T; (...args: Y): T; } -interface SpyInstance extends MockInstance {} +interface SpyInstance> extends MockInstance {} -interface MockInstance { +interface MockInstance> { _isMockFunction: true; _protoImpl: Function; getMockName(): string; @@ -432,7 +432,7 @@ class ModuleMockerClass { return Array.from(slots); } - private _ensureMockConfig( + private _ensureMockConfig>( f: Mock, ): MockFunctionConfig { let config = this._mockConfigRegistry.get(f); @@ -443,7 +443,7 @@ class ModuleMockerClass { return config; } - private _ensureMockState( + private _ensureMockState>( f: Mock, ): MockFunctionState { let state = this._mockState.get(f); @@ -465,7 +465,10 @@ class ModuleMockerClass { }; } - private _defaultMockState(): MockFunctionState { + private _defaultMockState>(): MockFunctionState< + T, + Y + > { return { calls: [], instances: [], @@ -474,19 +477,19 @@ class ModuleMockerClass { }; } - private _makeComponent( + private _makeComponent>( metadata: JestMock.MockFunctionMetadata, restore?: () => void, ): Object; - private _makeComponent( + private _makeComponent>( metadata: JestMock.MockFunctionMetadata, restore?: () => void, ): Array; - private _makeComponent( + private _makeComponent>( metadata: JestMock.MockFunctionMetadata, restore?: () => void, ): RegExp; - private _makeComponent( + private _makeComponent>( metadata: JestMock.MockFunctionMetadata< T, Y, @@ -494,11 +497,11 @@ class ModuleMockerClass { >, restore?: () => void, ): T; - private _makeComponent( + private _makeComponent>( metadata: JestMock.MockFunctionMetadata, restore?: () => void, ): Mock; - private _makeComponent( + private _makeComponent>( metadata: JestMock.MockFunctionMetadata, restore?: () => void, ): Object | Array | RegExp | T | undefined | Mock { @@ -744,7 +747,7 @@ class ModuleMockerClass { } } - private _createMockFunction( + private _createMockFunction>( metadata: JestMock.MockFunctionMetadata, mockConstructor: Function, ): Function { @@ -804,7 +807,7 @@ class ModuleMockerClass { return createConstructor(mockConstructor); } - private _generateMock( + private _generateMock>( metadata: JestMock.MockFunctionMetadata, callbacks: Array, refs: { @@ -854,10 +857,10 @@ class ModuleMockerClass { * @param _metadata Metadata for the mock in the schema returned by the * getMetadata method of this module. */ - generateFromMetadata( + generateFromMetadata>( _metadata: JestMock.MockFunctionMetadata, ): Mock { - const callbacks: Function[] = []; + const callbacks: Array = []; const refs = {}; const mock = this._generateMock(_metadata, callbacks, refs); callbacks.forEach(setter => setter()); @@ -868,7 +871,7 @@ class ModuleMockerClass { * @see README.md * @param component The component for which to retrieve metadata. */ - getMetadata( + getMetadata>( component: T, _refs?: Map, ): JestMock.MockFunctionMetadata | null { @@ -941,7 +944,9 @@ class ModuleMockerClass { return !!fn && fn._isMockFunction === true; } - fn(implementation?: (...args: Y) => T): Mock { + fn>( + implementation?: (...args: Y) => T, + ): Mock { const length = implementation ? implementation.length : 0; const fn = this._makeComponent({length, type: 'function'}); if (implementation) { @@ -965,7 +970,7 @@ class ModuleMockerClass { spyOn>( object: T, methodName: M, - ): T[M] extends (...args: any[]) => any + ): T[M] extends (...args: Array) => any ? SpyInstance, Parameters> : never; diff --git a/packages/jest-resolve-dependencies/src/index.ts b/packages/jest-resolve-dependencies/src/index.ts index 71719bc090a4..a3bad4d4965b 100644 --- a/packages/jest-resolve-dependencies/src/index.ts +++ b/packages/jest-resolve-dependencies/src/index.ts @@ -13,7 +13,7 @@ import {isSnapshotPath, SnapshotResolver} from 'jest-snapshot'; namespace DependencyResolver { export type ResolvedModule = { file: Config.Path; - dependencies: Config.Path[]; + dependencies: Array; }; } diff --git a/packages/jest-resolve/src/index.ts b/packages/jest-resolve/src/index.ts index 12ccc4fe0e22..4c175fc21846 100644 --- a/packages/jest-resolve/src/index.ts +++ b/packages/jest-resolve/src/index.ts @@ -30,7 +30,7 @@ type BooleanObject = {[key: string]: boolean}; namespace Resolver { export type ResolveModuleConfig = { skipNodeResolution?: boolean; - paths?: Config.Path[]; + paths?: Array; }; } diff --git a/packages/jest-resolve/src/nodeModulesPaths.ts b/packages/jest-resolve/src/nodeModulesPaths.ts index 4526660808d6..634cb55f7389 100644 --- a/packages/jest-resolve/src/nodeModulesPaths.ts +++ b/packages/jest-resolve/src/nodeModulesPaths.ts @@ -19,7 +19,7 @@ type NodeModulesPathsOptions = { export default function nodeModulesPaths( basedir: Config.Path, options: NodeModulesPathsOptions, -): Config.Path[] { +): Array { const modules = options && options.moduleDirectory ? Array.from(options.moduleDirectory) diff --git a/packages/jest-runtime/src/index.ts b/packages/jest-runtime/src/index.ts index 694738227f3a..0cae4501c33b 100644 --- a/packages/jest-runtime/src/index.ts +++ b/packages/jest-runtime/src/index.ts @@ -85,7 +85,7 @@ class Runtime { private _isCurrentlyExecutingManualMock: string | null; private _mockFactories: {[key: string]: () => unknown}; private _mockMetaDataCache: { - [key: string]: MockFunctionMetadata; + [key: string]: MockFunctionMetadata>; }; private _mockRegistry: {[key: string]: any}; private _isolatedMockRegistry: {[key: string]: any} | null; diff --git a/packages/jest-snapshot/src/__tests__/plugins.test.ts b/packages/jest-snapshot/src/__tests__/plugins.test.ts index feb47a2ea591..1f02265f8547 100644 --- a/packages/jest-snapshot/src/__tests__/plugins.test.ts +++ b/packages/jest-snapshot/src/__tests__/plugins.test.ts @@ -7,7 +7,7 @@ beforeEach(() => jest.resetModules()); -const testPath = (names: string[]) => { +const testPath = (names: Array) => { const {addSerializer, getSerializers} = require('../plugins'); const prev = getSerializers(); const added = names.map(name => diff --git a/packages/jest-snapshot/src/inline_snapshots.ts b/packages/jest-snapshot/src/inline_snapshots.ts index 9468c1c4ec43..fad8e372c7f3 100644 --- a/packages/jest-snapshot/src/inline_snapshots.ts +++ b/packages/jest-snapshot/src/inline_snapshots.ts @@ -25,7 +25,7 @@ export type InlineSnapshot = { }; export const saveInlineSnapshots = ( - snapshots: InlineSnapshot[], + snapshots: Array, prettier: any, babelTraverse: Function, ) => { @@ -93,7 +93,7 @@ const saveSnapshotsForFile = ( const groupSnapshotsBy = ( createKey: (inlineSnapshot: InlineSnapshot) => string, ) => (snapshots: Array) => - snapshots.reduce<{[key: string]: InlineSnapshot[]}>( + snapshots.reduce<{[key: string]: Array}>( (object, inlineSnapshot) => { const key = createKey(inlineSnapshot); return {...object, [key]: (object[key] || []).concat(inlineSnapshot)}; @@ -109,7 +109,7 @@ const groupSnapshotsByFrame = groupSnapshotsBy(({frame: {line, column}}) => const groupSnapshotsByFile = groupSnapshotsBy(({frame: {file}}) => file); const createParser = ( - snapshots: InlineSnapshot[], + snapshots: Array, inferredParser: string, babelTraverse: Function, ) => ( diff --git a/packages/jest-snapshot/src/snapshot_resolver.ts b/packages/jest-snapshot/src/snapshot_resolver.ts index 824fb5307dfa..2903dc820d0e 100644 --- a/packages/jest-snapshot/src/snapshot_resolver.ts +++ b/packages/jest-snapshot/src/snapshot_resolver.ts @@ -68,7 +68,7 @@ function createCustomSnapshotResolver( ): SnapshotResolver { const custom: SnapshotResolver = require(snapshotResolverPath); - const keys: [keyof SnapshotResolver, string][] = [ + const keys: Array<[keyof SnapshotResolver, string]> = [ ['resolveSnapshotPath', 'function'], ['resolveTestPath', 'function'], ['testPathForConsistencyCheck', 'string'], diff --git a/packages/jest-validate/src/validateCLIOptions.ts b/packages/jest-validate/src/validateCLIOptions.ts index 54691ded5ac3..9a2e6406ddbb 100644 --- a/packages/jest-validate/src/validateCLIOptions.ts +++ b/packages/jest-validate/src/validateCLIOptions.ts @@ -66,7 +66,7 @@ export default function validateCLIOptions( [s: string]: {alias?: string}; deprecationEntries: DeprecatedOptions; }, - rawArgv: string[] = [], + rawArgv: Array = [], ) { const yargsSpecialOptions = ['$0', '_', 'help', 'h']; const deprecationEntries = options.deprecationEntries || {}; diff --git a/packages/pretty-format/src/__tests__/AsymmetricMatcher.test.ts b/packages/pretty-format/src/__tests__/AsymmetricMatcher.test.ts index b46d96ba5565..a9766c401faa 100644 --- a/packages/pretty-format/src/__tests__/AsymmetricMatcher.test.ts +++ b/packages/pretty-format/src/__tests__/AsymmetricMatcher.test.ts @@ -12,7 +12,7 @@ import prettyFormat from '../'; const {AsymmetricMatcher} = prettyFormat.plugins; let options: OptionsReceived; -function fnNameFor(func: (...any: any[]) => any) { +function fnNameFor(func: (...any: Array) => any) { if (func.name) { return func.name; } diff --git a/packages/pretty-format/src/__tests__/prettyFormat.test.ts b/packages/pretty-format/src/__tests__/prettyFormat.test.ts index 779d3c45a754..bcfca99f7c3d 100644 --- a/packages/pretty-format/src/__tests__/prettyFormat.test.ts +++ b/packages/pretty-format/src/__tests__/prettyFormat.test.ts @@ -30,7 +30,7 @@ describe('prettyFormat()', () => { }); it('prints an empty array', () => { - const val: never[] = []; + const val: Array = []; expect(prettyFormat(val)).toEqual('Array []'); }); diff --git a/packages/pretty-format/src/index.ts b/packages/pretty-format/src/index.ts index 88455e20d7a7..b4daddc17114 100644 --- a/packages/pretty-format/src/index.ts +++ b/packages/pretty-format/src/index.ts @@ -33,7 +33,7 @@ const symbolToString = Symbol.prototype.toString; * Explicitly comparing typeof constructor to function avoids undefined as name * when mock identity-obj-proxy returns the key as the value for any key. */ -const getConstructorName = (val: new (...args: any[]) => any) => +const getConstructorName = (val: new (...args: Array) => any) => (typeof val.constructor === 'function' && val.constructor.name) || 'Object'; /* global window */ diff --git a/packages/pretty-format/src/plugins/ReactElement.ts b/packages/pretty-format/src/plugins/ReactElement.ts index 36fc15f3deee..83b71fcde830 100644 --- a/packages/pretty-format/src/plugins/ReactElement.ts +++ b/packages/pretty-format/src/plugins/ReactElement.ts @@ -23,7 +23,7 @@ const memoSymbol = Symbol.for('react.memo'); // Given element.props.children, or subtree during recursive traversal, // return flattened array of children. -const getChildren = (arg: any[], children = []) => { +const getChildren = (arg: Array, children = []) => { if (Array.isArray(arg)) { arg.forEach(item => { getChildren(item, children);