From 8f47a06255a20fef923f34a77a25f5e6dcf2838b Mon Sep 17 00:00:00 2001 From: Armano Date: Sat, 25 Mar 2023 09:17:26 +0100 Subject: [PATCH] fix: correct crashes with getTypeArguments for ts < 3.7 --- .../eslint-plugin/src/rules/no-misused-promises.ts | 4 ++-- packages/eslint-plugin/src/rules/no-unsafe-argument.ts | 10 ++++++---- .../src/rules/require-array-sort-compare.ts | 2 +- packages/type-utils/src/isTypeReadonly.ts | 5 ++--- 4 files changed, 11 insertions(+), 10 deletions(-) diff --git a/packages/eslint-plugin/src/rules/no-misused-promises.ts b/packages/eslint-plugin/src/rules/no-misused-promises.ts index 06aad3bf1fbb..8a7f2875170f 100644 --- a/packages/eslint-plugin/src/rules/no-misused-promises.ts +++ b/packages/eslint-plugin/src/rules/no-misused-promises.ts @@ -555,7 +555,7 @@ function voidFunctionArguments( // Unwrap 'Array' to 'MaybeVoidFunction', // so that we'll handle it in the same way as a non-rest // 'param: MaybeVoidFunction' - type = checker.getTypeArguments(type)[0]; + type = util.getTypeArguments(type, checker)[0]; for (let i = index; i < node.arguments.length; i++) { checkThenableOrVoidArgument( checker, @@ -569,7 +569,7 @@ function voidFunctionArguments( } else if (checker.isTupleType(type)) { // Check each type in the tuple - for example, [boolean, () => void] would // add the index of the second tuple parameter to 'voidReturnIndices' - const typeArgs = checker.getTypeArguments(type); + const typeArgs = util.getTypeArguments(type, checker); for ( let i = index; i < node.arguments.length && i - index < typeArgs.length; diff --git a/packages/eslint-plugin/src/rules/no-unsafe-argument.ts b/packages/eslint-plugin/src/rules/no-unsafe-argument.ts index b5aced4d68c1..6e9bdae31b88 100644 --- a/packages/eslint-plugin/src/rules/no-unsafe-argument.ts +++ b/packages/eslint-plugin/src/rules/no-unsafe-argument.ts @@ -57,13 +57,13 @@ class FunctionSignature { // is a rest param if (checker.isArrayType(type)) { restType = { - type: checker.getTypeArguments(type)[0], + type: util.getTypeArguments(type, checker)[0], kind: RestTypeKind.Array, index: i, }; } else if (checker.isTupleType(type)) { restType = { - typeArguments: checker.getTypeArguments(type), + typeArguments: util.getTypeArguments(type, checker), kind: RestTypeKind.Tuple, index: i, }; @@ -202,8 +202,10 @@ export default util.createRule<[], MessageIds>({ }); } else if (checker.isTupleType(spreadArgType)) { // foo(...[tuple1, tuple2]) - const spreadTypeArguments = - checker.getTypeArguments(spreadArgType); + const spreadTypeArguments = util.getTypeArguments( + spreadArgType, + checker, + ); for (const tupleType of spreadTypeArguments) { const parameterType = signature.getNextParameterType(); if (parameterType == null) { diff --git a/packages/eslint-plugin/src/rules/require-array-sort-compare.ts b/packages/eslint-plugin/src/rules/require-array-sort-compare.ts index aafd46e690d3..1a9a8b795654 100644 --- a/packages/eslint-plugin/src/rules/require-array-sort-compare.ts +++ b/packages/eslint-plugin/src/rules/require-array-sort-compare.ts @@ -55,7 +55,7 @@ export default util.createRule({ service.esTreeNodeToTSNodeMap.get(node), ); if (checker.isArrayType(type) || checker.isTupleType(type)) { - const typeArgs = checker.getTypeArguments(type); + const typeArgs = util.getTypeArguments(type, checker); return typeArgs.every( arg => util.getTypeName(checker, arg) === 'string', ); diff --git a/packages/type-utils/src/isTypeReadonly.ts b/packages/type-utils/src/isTypeReadonly.ts index 7ba2b300089a..b7eb7a261707 100644 --- a/packages/type-utils/src/isTypeReadonly.ts +++ b/packages/type-utils/src/isTypeReadonly.ts @@ -10,6 +10,7 @@ import { } from 'tsutils'; import * as ts from 'typescript'; +import { getTypeArguments } from './getTypeArguments'; import { getTypeOfPropertyOfType } from './propertyTypes'; const enum Readonlyness { @@ -52,9 +53,7 @@ function isTypeReadonlyArrayOrTuple( function checkTypeArguments(arrayType: ts.TypeReference): Readonlyness { const typeArguments = // getTypeArguments was only added in TS3.7 - checker.getTypeArguments - ? checker.getTypeArguments(arrayType) - : arrayType.typeArguments ?? []; + getTypeArguments(arrayType, checker); // this shouldn't happen in reality as: // - tuples require at least 1 type argument