UNPKG

4 kBJavaScriptView Raw
1"use strict";
2var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3 if (k2 === undefined) k2 = k;
4 Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
5}) : (function(o, m, k, k2) {
6 if (k2 === undefined) k2 = k;
7 o[k2] = m[k];
8}));
9var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
10 Object.defineProperty(o, "default", { enumerable: true, value: v });
11}) : function(o, v) {
12 o["default"] = v;
13});
14var __importStar = (this && this.__importStar) || function (mod) {
15 if (mod && mod.__esModule) return mod;
16 var result = {};
17 if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
18 __setModuleDefault(result, mod);
19 return result;
20};
21Object.defineProperty(exports, "__esModule", { value: true });
22const utils_1 = require("@typescript-eslint/utils");
23const util = __importStar(require("../util"));
24const getMemberExpressionName = (member) => {
25 if (!member.computed) {
26 return member.property.name;
27 }
28 if (member.property.type === utils_1.AST_NODE_TYPES.Literal &&
29 typeof member.property.value === 'string') {
30 return member.property.value;
31 }
32 return null;
33};
34exports.default = util.createRule({
35 name: 'prefer-reduce-type-parameter',
36 meta: {
37 type: 'problem',
38 docs: {
39 recommended: false,
40 description: 'Prefer using type parameter when calling `Array#reduce` instead of casting',
41 requiresTypeChecking: true,
42 },
43 messages: {
44 preferTypeParameter: 'Unnecessary cast: Array#reduce accepts a type parameter for the default value.',
45 },
46 fixable: 'code',
47 schema: [],
48 },
49 defaultOptions: [],
50 create(context) {
51 const service = util.getParserServices(context);
52 const checker = service.program.getTypeChecker();
53 return {
54 'CallExpression > MemberExpression.callee'(callee) {
55 if (getMemberExpressionName(callee) !== 'reduce') {
56 return;
57 }
58 const [, secondArg] = callee.parent.arguments;
59 if (callee.parent.arguments.length < 2 ||
60 !util.isTypeAssertion(secondArg)) {
61 return;
62 }
63 // Get the symbol of the `reduce` method.
64 const tsNode = service.esTreeNodeToTSNodeMap.get(callee.object);
65 const calleeObjType = util.getConstrainedTypeAtLocation(checker, tsNode);
66 // Check the owner type of the `reduce` method.
67 if (checker.isArrayType(calleeObjType)) {
68 context.report({
69 messageId: 'preferTypeParameter',
70 node: secondArg,
71 fix: fixer => {
72 const fixes = [
73 fixer.removeRange([
74 secondArg.range[0],
75 secondArg.expression.range[0],
76 ]),
77 fixer.removeRange([
78 secondArg.expression.range[1],
79 secondArg.range[1],
80 ]),
81 ];
82 if (!callee.parent.typeParameters) {
83 fixes.push(fixer.insertTextAfter(callee, `<${context
84 .getSourceCode()
85 .getText(secondArg.typeAnnotation)}>`));
86 }
87 return fixes;
88 },
89 });
90 return;
91 }
92 },
93 };
94 },
95});
96//# sourceMappingURL=prefer-reduce-type-parameter.js.map
\No newline at end of file