在 Blog 中记录我的 type challenge 学习记录


从展示报错开始

学习目标:typescript 初阶体操

交互设计:编辑器,编写 own code

vs. typeChallenge VSCode 插件:own code 与原文在一起,重新开始的时候不够方便

1. 展示报错

使用 astro + shiki + twoslash 可以实现 typescript 报错

关键配置:

  • (可选)markdown 启用 shiki 插件;如不启用, 则使用内置的组件 Code 并配置 transformer
  • 配置 twoslash renderRich 需要的 全局样式
  • (关键)代码中配置 @errors: xxxx 预测要显示的 typescript 报错;否则会构建出错
// ============= Test Cases =============

type type Expect<T extends true> = TExpect<function (type parameter) T in type Expect<T extends true>T extends true> = function (type parameter) T in type Expect<T extends true>T

type type Equal<X, Y> = (<T>() => T extends X ? 1 : 2) extends <T>() => T extends Y ? 1 : 2 ? true : falseEqual<function (type parameter) X in type Equal<X, Y>X, function (type parameter) Y in type Equal<X, Y>Y> = (<function (type parameter) T in <T>(): T extends X ? 1 : 2T>() => function (type parameter) T in <T>(): T extends X ? 1 : 2T extends function (type parameter) X in type Equal<X, Y>X ? 1 : 2) extends <function (type parameter) T in <T>(): T extends Y ? 1 : 2T>() => function (type parameter) T in <T>(): T extends Y ? 1 : 2T extends function (type parameter) Y in type Equal<X, Y>Y ? 1 : 2
  ? true
  : false

type type cases = [false, false, any]cases = [
  type Expect<T extends true> = TExpect<Equal<Expected1, MyPick<Todo, 'title'>>>,
Type 'false' does not satisfy the constraint 'true'.
type Expect<T extends true> = TExpect<Equal<Expected2, MyPick<Todo, 'title' | 'completed'>>>,
Type 'false' does not satisfy the constraint 'true'.
// @ts-expect-error type MyPick<T, K extends keyof T> = anyMyPick<Todo, 'title' | 'completed' | 'invalid'>, ] interface Todo { Todo.title: stringtitle: string Todo.description: stringdescription: string Todo.completed: booleancompleted: boolean } interface Expected1 { Expected1.title: stringtitle: string } interface Expected2 { Expected2.title: stringtitle: string Expected2.completed: booleancompleted: boolean } // ============= Your Code Here ============= type type MyPick<T, K extends keyof T> = anyMyPick<function (type parameter) T in type MyPick<T, K extends keyof T>T, function (type parameter) K in type MyPick<T, K extends keyof T>K extends keyof function (type parameter) T in type MyPick<T, K extends keyof T>T> = any