CtrlK
BlogDocsLog inGet started
Tessl Logo

pantheon-ai/typescript-advanced

Comprehensive TypeScript guidance covering compiler configuration, advanced types, utility types, type guards, strict mode workflows, and documentation patterns; use when configuring tsconfig, designing complex generics, making illegal states unrepresentable, fixing type errors, or writing testable and maintainable type-safe APIs.

Overall
score

99%

Does it follow best practices?

Validation for skill structure

Overview
Skills
Evals
Files

guards-inference-infer.mdreferences/

Type Inference with infer

Overview

The infer keyword allows extracting types from other types within conditional type expressions, enabling powerful type-level programming.

Extracting Function Return Type

type ReturnType<T> = T extends (...args: any[]) => infer R ? R : never;

function getUser() {
  return { id: 1, name: "Alice" };
}

type User = ReturnType<typeof getUser>; 
// { id: number; name: string; }

Extracting Function Parameters

type Parameters<T> = T extends (...args: infer P) => any ? P : never;

function createUser(name: string, age: number) {
  return { name, age };
}

type CreateUserParams = Parameters<typeof createUser>;
// [name: string, age: number]

Extracting Array Element Type

type ArrayElement<T> = T extends (infer E)[] ? E : never;

type StringArray = string[];
type Element = ArrayElement<StringArray>; // string

type MixedArray = (string | number)[];
type MixedElement = ArrayElement<MixedArray>; // string | number

Extracting Promise Value

type Awaited<T> = T extends Promise<infer U> ? U : T;

async function fetchUser() {
  return { id: 1, name: "Alice" };
}

type User = Awaited<ReturnType<typeof fetchUser>>;
// { id: number; name: string; }

Extracting Object Property Type

type PropType<T, K extends keyof T> = T extends { [P in K]: infer V }
  ? V
  : never;

interface User {
  id: number;
  name: string;
  email: string;
}

type EmailType = PropType<User, "email">; // string

Extracting Constructor Parameters

type ConstructorParameters<T> = T extends new (...args: infer P) => any
  ? P
  : never;

class User {
  constructor(public name: string, public age: number) {}
}

type UserConstructorParams = ConstructorParameters<typeof User>;
// [name: string, age: number]

Extracting Instance Type

type InstanceType<T> = T extends new (...args: any[]) => infer R ? R : never;

class Database {
  connect() { }
  query(sql: string) { }
}

type DB = InstanceType<typeof Database>;
// Database

Nested infer

type DeepArrayElement<T> = T extends (infer E)[]
  ? E extends (infer F)[]
    ? F
    : E
  : never;

type NestedArray = string[][];
type Element = DeepArrayElement<NestedArray>; // string

Inferring Tuple Elements

type First<T> = T extends [infer F, ...any[]] ? F : never;
type Rest<T> = T extends [any, ...infer R] ? R : never;

type Tuple = [string, number, boolean];
type FirstElement = First<Tuple>; // string
type RestElements = Rest<Tuple>; // [number, boolean]

Inferring Function This Type

type ThisType<T> = T extends (this: infer U, ...args: any[]) => any
  ? U
  : never;

interface Database {
  query(this: Database, sql: string): void;
}

type DB = ThisType<Database["query"]>; // Database

Best Practices

  • Use infer for extracting types from complex structures
  • Combine infer with distributive conditional types
  • Name inferred types descriptively (U, V, R for Return, P for Parameters)
  • Consider built-in utility types before creating custom ones
  • Document complex infer usage

Common Pitfalls

  • infer only works within extends clauses of conditional types
  • Multiple infer of same type variable creates union
  • Can't infer constrained generic types directly
  • Over-nesting makes types hard to understand

Install with Tessl CLI

npx tessl i pantheon-ai/typescript-advanced

references

compiler-module-resolution.md

compiler-performance.md

compiler-strict-mode.md

compiler-tsconfig.md

docs-adr-templates.md

docs-framework-docs.md

docs-jsdoc-patterns.md

docs-typedoc-config.md

guards-assertion-functions.md

guards-basic.md

guards-branded-types.md

guards-discriminated-unions.md

guards-exhaustiveness.md

guards-generic.md

guards-inference-infer.md

guards-inference-return.md

patterns-advanced-generics.md

patterns-api-client.md

patterns-branded-types.md

patterns-builder.md

patterns-deep-readonly.md

patterns-dependency-injection.md

patterns-event-emitter.md

patterns-form-validation.md

patterns-plugin-system.md

patterns-recursive-types.md

patterns-state-machine.md

patterns-type-safe-module.md

practices-illegal-states.md

practices-module-patterns.md

practices-runtime-validation.md

practices-type-first.md

types-conditional.md

types-generics.md

types-index-signatures.md

types-mapped.md

types-narrowing.md

types-template-literals.md

types-type-assertions.md

types-unions-intersections.md

utilities-custom-mapped-types.md

utilities-extract-exclude.md

utilities-key-remapping.md

utilities-nonnullable-awaited.md

utilities-partial-required.md

utilities-pick-omit.md

utilities-readonly-record.md

utilities-returntype-parameters.md

SKILL.md

tile.json