📄 getTypeName¶
📊 Analysis Summary¶
| Metric | Count |
|---|---|
| 🔧 Functions | 1 |
📚 Table of Contents¶
🛠️ File Location:¶
📂 packages/type-utils/src/getTypeName.ts
Functions¶
getTypeName(typeChecker: ts.TypeChecker, type: ts.Type): string¶
Get the type name of a given type.
Parameters:
typeCheckerany: The context sensitive TypeScript TypeChecker.typeany: The type to get the name of.
Raw JSDoc
Calls:
tsutils.isTypeFlagSettype.getSymbolsymbol?.getDeclarationsts.isTypeParameterDeclarationgetTypeNametypeChecker.getTypeFromTypeNodetype.isUniontype.types .map(value => getTypeName(typeChecker, value)) .everytype.isIntersectiontype.types .map(value => getTypeName(typeChecker, value)) .sometypeChecker.typeToString
Internal Comments:
// It handles `string` and string literal types as string.
// If the type is a type parameter which extends primitive string types,
// but it was not recognized as a string like. So check the constraint
// type of the type parameter.
// `type.getConstraint()` method doesn't return the constraint type of (x2)
// the type parameter for some reason. So this gets the constraint type (x2)
// via AST. (x2)
// If the type is a union and all types in the union are string like,
// return `string`. For example:
// - `"a" | "b"` is string.
// - `string | string[]` is not string.
// If the type is an intersection and a type in the intersection is string
// like, return `string`. For example: `string & {__htmlEscaped: void}`
Code
export function getTypeName(
typeChecker: ts.TypeChecker,
type: ts.Type,
): string {
// It handles `string` and string literal types as string.
if (tsutils.isTypeFlagSet(type, ts.TypeFlags.StringLike)) {
return 'string';
}
// If the type is a type parameter which extends primitive string types,
// but it was not recognized as a string like. So check the constraint
// type of the type parameter.
if (tsutils.isTypeFlagSet(type, ts.TypeFlags.TypeParameter)) {
// `type.getConstraint()` method doesn't return the constraint type of
// the type parameter for some reason. So this gets the constraint type
// via AST.
const symbol = type.getSymbol();
const decls = symbol?.getDeclarations();
const typeParamDecl = decls?.[0];
if (
typeParamDecl != null &&
ts.isTypeParameterDeclaration(typeParamDecl) &&
typeParamDecl.constraint != null
) {
return getTypeName(
typeChecker,
typeChecker.getTypeFromTypeNode(typeParamDecl.constraint),
);
}
}
// If the type is a union and all types in the union are string like,
// return `string`. For example:
// - `"a" | "b"` is string.
// - `string | string[]` is not string.
if (
type.isUnion() &&
type.types
.map(value => getTypeName(typeChecker, value))
.every(t => t === 'string')
) {
return 'string';
}
// If the type is an intersection and a type in the intersection is string
// like, return `string`. For example: `string & {__htmlEscaped: void}`
if (
type.isIntersection() &&
type.types
.map(value => getTypeName(typeChecker, value))
.some(t => t === 'string')
) {
return 'string';
}
return typeChecker.typeToString(type);
}
Generated by Syntax Scribe