📄 getContextualType¶
📊 Analysis Summary¶
| Metric | Count |
|---|---|
| 🔧 Functions | 1 |
📚 Table of Contents¶
🛠️ File Location:¶
📂 packages/type-utils/src/getContextualType.ts
Functions¶
getContextualType(checker: ts.TypeChecker, node: ts.Expression): ts.Type | undefined¶
Returns the contextual type of a given node. Contextual type is the type of the target the node is going into. i.e. the type of a called function's parameter, or the defined type of a variable declaration
Raw JSDoc
Calls:
ts.isCallExpressionts.isNewExpressionts.isVariableDeclarationts.isPropertyDeclarationts.isParameterchecker.getTypeFromTypeNodets.isJsxExpressionchecker.getContextualTypets.isIdentifierts.isPropertyAssignmentts.isShorthandPropertyAssignmentts.isBinaryExpressionchecker.getTypeAtLocation[ts.SyntaxKind.JsxExpression, ts.SyntaxKind.TemplateSpan].includes
Internal Comments:
// is the callee, so has no contextual type
// is RHS of assignment
// parent is not something we know we can get the contextual type of
// TODO - support return statement checking
Code
export function getContextualType(
checker: ts.TypeChecker,
node: ts.Expression,
): ts.Type | undefined {
const parent = node.parent;
if (ts.isCallExpression(parent) || ts.isNewExpression(parent)) {
if (node === parent.expression) {
// is the callee, so has no contextual type
return;
}
} else if (
ts.isVariableDeclaration(parent) ||
ts.isPropertyDeclaration(parent) ||
ts.isParameter(parent)
) {
return parent.type ? checker.getTypeFromTypeNode(parent.type) : undefined;
} else if (ts.isJsxExpression(parent)) {
return checker.getContextualType(parent);
} else if (
ts.isIdentifier(node) &&
(ts.isPropertyAssignment(parent) ||
ts.isShorthandPropertyAssignment(parent))
) {
return checker.getContextualType(node);
} else if (
ts.isBinaryExpression(parent) &&
parent.operatorToken.kind === ts.SyntaxKind.EqualsToken &&
parent.right === node
) {
// is RHS of assignment
return checker.getTypeAtLocation(parent.left);
} else if (
![ts.SyntaxKind.JsxExpression, ts.SyntaxKind.TemplateSpan].includes(
parent.kind,
)
) {
// parent is not something we know we can get the contextual type of
return;
}
// TODO - support return statement checking
return checker.getContextualType(node);
}
Generated by Syntax Scribe