β¬ οΈ Back to Table of Contents
π prefer-readonly-parameter-types¶
π Analysis Summary¶
| Metric | Count |
|---|---|
| π§ Functions | 2 |
| π¦ Imports | 9 |
| π Type Aliases | 2 |
π Table of Contents¶
π οΈ File Location:¶
π packages/eslint-plugin/src/rules/prefer-readonly-parameter-types.ts
π€ Default Export¶
| Property | Value |
|---|---|
name |
'prefer-readonly-parameter-types' |
meta.type |
'suggestion' |
meta.docs.description |
'Require function parameters to be typed as readonly to prevent accidental mutation of inputs' |
meta.docs.requiresTypeChecking |
true |
meta.messages.shouldBeReadonly |
'Parameter should be a read only type.' |
meta.schema |
[ { type: 'object', additionalProperties: false, properties: { allow: { ...readonlynessOptionsSchema.properties.allow... |
defaultOptions |
[ { allow: readonlynessOptionsDefaults.allow, checkParameterProperties: true, ignoreInferredTypes: false, treatMethod... |
Entry point: create β documented under Functions.
π¦ Imports¶
| Name | Source |
|---|---|
TSESTree |
@typescript-eslint/utils |
AST_NODE_TYPES |
@typescript-eslint/utils |
TypeOrValueSpecifier |
../util |
createRule |
../util |
getParserServices |
../util |
isTypeBrandedLiteralLike |
../util |
isTypeReadonly |
../util |
readonlynessOptionsDefaults |
../util |
readonlynessOptionsSchema |
../util |
Functions¶
create(context: any, [ { allow, checkParameterProperβ¦: any): { [x: string]: (node: TSESTree.ArrowFunctionExpression | TS⦶
Parameters:
contextany[ { allow, checkParameterProperties, ignoreInferredTypes, treatMethodsAsReadonly, }, ]any
Returns: { [x: string]: (node: TSESTree.ArrowFunctionExpression | TSESTree.FunctionDeclaration | TSESTree.FunctionExpression | TSESTree.TSCallSignatureDeclaration | TSESTree.TSConstructSignatureDeclaration | TSESTree.TSDeclareFunction | TSESTree.TSEmptyBodyFunctionExpression | TSESTree.TSFunctionType | TSESTree.TSMethodSignature) => void; }
Calls:
getParserServices (from ../util)services.program.getTypeCheckerservices.esTreeNodeToTSNodeMap.getchecker.getTypeFromTypeNodeservices.getTypeAtLocation[ AST_NODE_TYPES.ArrowFunctionExpression, AST_NODE_TYPES.FunctionDeclaration, AST_NODE_TYPES.FunctionExpression, AST_NODE_TYPES.TSCallSignatureDeclaration, AST_NODE_TYPES.TSConstructSignatureDeclaration, AST_NODE_TYPES.TSDeclareFunction, AST_NODE_TYPES.TSEmptyBodyFunctionExpression, AST_NODE_TYPES.TSFunctionType, AST_NODE_TYPES.TSMethodSignature, ].joingetParameterTypeisTypeReadonly (from ../util)isTypeBrandedLiteralLike (from ../util)context.report
Internal Comments:
Code
create(
context,
[
{
allow,
checkParameterProperties,
ignoreInferredTypes,
treatMethodsAsReadonly,
},
],
) {
const services = getParserServices(context);
function getParameterType(
actualParam:
| TSESTree.ArrayPattern
| TSESTree.AssignmentPattern
| TSESTree.Identifier
| TSESTree.ObjectPattern
| TSESTree.RestElement,
): ts.Type {
if (actualParam.typeAnnotation?.typeAnnotation) {
// Get type from annotation node to preserve aliasSymbol
const checker = services.program.getTypeChecker();
const tsTypeNode = services.esTreeNodeToTSNodeMap.get(
actualParam.typeAnnotation.typeAnnotation,
) as ts.TypeNode;
return checker.getTypeFromTypeNode(tsTypeNode);
}
return services.getTypeAtLocation(actualParam);
}
return {
[[
AST_NODE_TYPES.ArrowFunctionExpression,
AST_NODE_TYPES.FunctionDeclaration,
AST_NODE_TYPES.FunctionExpression,
AST_NODE_TYPES.TSCallSignatureDeclaration,
AST_NODE_TYPES.TSConstructSignatureDeclaration,
AST_NODE_TYPES.TSDeclareFunction,
AST_NODE_TYPES.TSEmptyBodyFunctionExpression,
AST_NODE_TYPES.TSFunctionType,
AST_NODE_TYPES.TSMethodSignature,
].join(', ')](
node:
| TSESTree.ArrowFunctionExpression
| TSESTree.FunctionDeclaration
| TSESTree.FunctionExpression
| TSESTree.TSCallSignatureDeclaration
| TSESTree.TSConstructSignatureDeclaration
| TSESTree.TSDeclareFunction
| TSESTree.TSEmptyBodyFunctionExpression
| TSESTree.TSFunctionType
| TSESTree.TSMethodSignature,
): void {
for (const param of node.params) {
if (
!checkParameterProperties &&
param.type === AST_NODE_TYPES.TSParameterProperty
) {
continue;
}
const actualParam =
param.type === AST_NODE_TYPES.TSParameterProperty
? param.parameter
: param;
if (ignoreInferredTypes && actualParam.typeAnnotation == null) {
continue;
}
const type = getParameterType(actualParam);
const isReadOnly = isTypeReadonly(services.program, type, {
allow,
treatMethodsAsReadonly: !!treatMethodsAsReadonly,
});
if (!isReadOnly && !isTypeBrandedLiteralLike(type)) {
context.report({
node: actualParam,
messageId: 'shouldBeReadonly',
});
}
}
},
};
}
Internal helpers¶
Declared inside another function in this file.
getParameterType(actualParam: | TSESTree.ArrayPattern | TSESTree.Assiβ¦): ts.Type¶
Parameters:
actualParam| TSESTree.ArrayPattern | TSESTree.AssignmentPattern | TSESTree.Identifier | TSESTree.ObjectPattern | TSESTree.RestElement
Returns: ts.Type
Calls:
services.program.getTypeCheckerservices.esTreeNodeToTSNodeMap.getchecker.getTypeFromTypeNodeservices.getTypeAtLocation
Internal Comments:
Code
function getParameterType(
actualParam:
| TSESTree.ArrayPattern
| TSESTree.AssignmentPattern
| TSESTree.Identifier
| TSESTree.ObjectPattern
| TSESTree.RestElement,
): ts.Type {
if (actualParam.typeAnnotation?.typeAnnotation) {
// Get type from annotation node to preserve aliasSymbol
const checker = services.program.getTypeChecker();
const tsTypeNode = services.esTreeNodeToTSNodeMap.get(
actualParam.typeAnnotation.typeAnnotation,
) as ts.TypeNode;
return checker.getTypeFromTypeNode(tsTypeNode);
}
return services.getTypeAtLocation(actualParam);
}
Type Aliases¶
Options¶
type Options = [
{
allow?: TypeOrValueSpecifier[];
checkParameterProperties?: boolean;
ignoreInferredTypes?: boolean;
treatMethodsAsReadonly?: boolean;
},
];
MessageIds¶
Generated by Syntax Scribe