在 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 Expect<T extends true> = TExpect<Equal<Expected2, MyPick<Todo, 'title' | 'completed'>>>, // @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