Skip to content

⬅️ Back to Table of Contents

📄 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:

  • typeChecker any: The context sensitive TypeScript TypeChecker.
  • type any: The type to get the name of.
Raw JSDoc
/**
 * Get the type name of a given type.
 * @param typeChecker The context sensitive TypeScript TypeChecker.
 * @param type The type to get the name of.
 */

Calls:

  • tsutils.isTypeFlagSet
  • type.getSymbol
  • symbol?.getDeclarations
  • ts.isTypeParameterDeclaration
  • getTypeName
  • typeChecker.getTypeFromTypeNode
  • type.isUnion
  • type.types .map(value => getTypeName(typeChecker, value)) .every
  • type.isIntersection
  • type.types .map(value => getTypeName(typeChecker, value)) .some
  • typeChecker.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