Pular para o conteúdo
Skillpedia
Código em geral41 mil · #4882

typescript-advanced-types

Faz seu agente usar tipos avançados no TypeScript. Isso garante que o código seja mais seguro e confiável.

O que ela faz

Este guia ensina como usar recursos avançados do TypeScript para criar código mais seguro e flexível. Ele cobre como fazer tipos que se adaptam a diferentes dados (genéricos), como criar tipos que mudam com base em condições, como transformar tipos existentes e como criar tipos baseados em texto.

Quando usar

  • ✓Ao criar bibliotecas de código que outras pessoas usarão.
  • ✓Quando você precisa que seu código seja muito seguro contra erros.
  • ✓Ao construir sistemas complexos onde os tipos de dados precisam ser bem definidos.

Exemplo do que pedir para a IA

“Como posso criar um tipo que só aceite números ou strings?”

Quer saber mais? Abra as seções abaixo.

Como usar

O jeito mais fácil: copie a mensagem abaixo e cole no Claude, ChatGPT, Cursor ou outra IA. Ela lê a skill e segue as instruções.

Link da skill

https://github.com/wshobson/agents/blob/main/plugins/javascript-typescript/skills/typescript-advanced-types/SKILL.md

Mensagem pronta para colar

Use esta skill para me ajudar: https://github.com/wshobson/agents/blob/main/plugins/javascript-typescript/skills/typescript-advanced-types/SKILL.md Leia o arquivo SKILL.md desse link e siga as instruções dele na minha tarefa.
Como funciona

O TypeScript permite definir regras para os tipos de dados. Recursos como genéricos e tipos condicionais ajudam a criar essas regras de forma automática e flexível, garantindo que os dados usados estejam corretos antes mesmo de executar o programa.

Instalação

Jeito mais fácil: copie o link da skill e cole no Claude, ChatGPT ou Cursor pedindo para seguir as instruções.

No terminal (Claude Code, Codex, Cursor), na pasta do projeto:

npx skills add wshobson/agents --skill typescript-advanced-types

Ou baixe só o arquivo:

curl -L https://raw.githubusercontent.com/wshobson/agents/main/plugins/javascript-typescript/skills/typescript-advanced-types/SKILL.md -o SKILL.md
Conteúdo técnico (SKILL.md)

Tradução do texto original do autor no GitHub. Os comandos e códigos estão como no original.

Tipos Avançados em TypeScript

Um guia completo para dominar o sistema de tipos avançados do TypeScript, incluindo genéricos, tipos condicionais, tipos mapeados, tipos de literais de template e tipos utilitários para construir aplicações robustas e com segurança de tipos.

Quando Usar Esta Habilidade

  • Construir bibliotecas ou frameworks com segurança de tipos
  • Criar componentes genéricos reutilizáveis
  • Implementar lógica complexa de inferência de tipos
  • Projetar clientes de API com segurança de tipos
  • Construir sistemas de validação de formulários
  • Criar objetos de configuração fortemente tipados
  • Implementar gerenciamento de estado com segurança de tipos
  • Migrar bases de código JavaScript para TypeScript

Conceitos Essenciais

1. Genéricos

Propósito: Criar componentes reutilizáveis e flexíveis em termos de tipos, mantendo a segurança de tipos.

Função Genérica Básica:

function identity<T>(value: T): T {
  return value;
}

const num = identity<number>(42); // Type: number
const str = identity<string>("hello"); // Type: string
const auto = identity(true); // Type inferred: boolean

Restrições Genéricas:

interface HasLength {
  length: number;
}

function logLength<T extends HasLength>(item: T): T {
  console.log(item.length);
  return item;
}

logLength("hello"); // OK: string has length
logLength([1, 2, 3]); // OK: array has length
logLength({ length: 10 }); // OK: object has length
// logLength(42);             // Error: number has no length

Múltiplos Parâmetros de Tipo:

function merge<T, U>(obj1: T, obj2: U): T & U {
  return { ...obj1, ...obj2 };
}

const merged = merge({ name: "John" }, { age: 30 });
// Type: { name: string } & { age: number }

2. Tipos Condicionais

Propósito: Criar tipos que dependem de condições, permitindo lógica de tipos sofisticada.

Tipo Condicional Básico:

type IsString<T> = T extends string ? true : false;

type A = IsString<string>; // true
type B = IsString<number>; // false

Extraindo Tipos de Retorno:

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

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

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

Tipos Condicionais Distributivos:

type ToArray<T> = T extends any ? T[] : never;

type StrOrNumArray = ToArray<string | number>;
// Type: string[] | number[]

Condições Aninhadas:

type TypeName<T> = T extends string
  ? "string"
  : T extends number
    ? "number"
    : T extends boolean
      ? "boolean"
      : T extends undefined
        ? "undefined"
        : T extends Function
          ? "function"
          : "object";

type T1 = TypeName<string>; // "string"
type T2 = TypeName<() => void>; // "function"

3. Tipos Mapeados

Propósito: Transformar tipos existentes iterando sobre suas propriedades.

Tipo Mapeado Básico:

type Readonly<T> = {
  readonly [P in keyof T]: T[P];
};

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

type ReadonlyUser = Readonly<User>;
// Type: { readonly id: number; readonly name: string; }

Propriedades Opcionais:

type Partial<T> = {
  [P in keyof T]?: T[P];
};

type PartialUser = Partial<User>;
// Type: { id?: number; name?: string; }

Remapeamento de Chaves:

type Getters<T> = {
  [K in keyof T as `get${Capitalize<string & K>}`]: () => T[K];
};

interface Person {
  name: string;
  age: number;
}

type PersonGetters = Getters<Person>;
// Type: { getName: () => string; getAge: () => number; }

Filtrando Propriedades:

type PickByType<T, U> = {
  [K in keyof T as T[K] extends U ? K : never]: T[K];
};

interface Mixed {
  id: number;
  name: string;
  age: number;
  active: boolean;
}

type OnlyNumbers = PickByType<Mixed, number>;
// Type: { id: number; age: number; }

4. Tipos de Literais de Template

Propósito: Criar tipos baseados em strings com correspondência de padrões e transformação.

Literal de Template Básico:

type EventName = "click" | "focus" | "blur";
type EventHandler = `on${Capitalize<EventName>}`;
// Type: "onClick" | "onFocus" | "onBlur"

Manipulação de Strings:

type UppercaseGreeting = Uppercase<"hello">; // "HELLO"
type LowercaseGreeting = Lowercase<"HELLO">; // "hello"
type CapitalizedName = Capitalize<"john">; // "John"
type UncapitalizedName = Uncapitalize<"John">; // "john"

Construção de Caminhos:

type Path<T> = T extends object
  ? {

…
Perguntas frequentes

O que são genéricos?

Genéricos são como 'espaços reservados' para tipos. Eles permitem criar funções ou classes que funcionam com qualquer tipo de dado, mas ainda assim garantem que o tipo usado seja o correto.

O que são tipos condicionais?

São tipos que se comportam de maneira diferente dependendo de uma condição. Por exemplo, um tipo pode ser 'verdadeiro' se o dado for uma string, e 'falso' se for um número.

Para que servem os tipos de template literal?

Eles permitem criar tipos baseados em strings, como criar nomes de eventos (`onClick`) a partir de um nome base (`click`), ou construir caminhos de configuração de forma segura.

Detalhes

Descrição original do autor

Master TypeScript's advanced type system including generics, conditional types, mapped types, template literals, and utility types for building type-safe applications. Use when implementing complex type logic, creating reusable type utilities, or ensuring compile-time type safety in TypeScript projects.

repo: wshobson/agents

Popularidade

Estrelas no GitHub
41 mil
Posição no ranking
#4882
Licença
MIT
Atualizada em
15/10/2026

Essa skill é útil?

0

Entre para votar.

Comentários

  • …

Mais skills deste repositório

Skills parecidas