目的
Github上的类型体操,让你写出更加优雅的TS类型定义,以及探寻TS中我们不熟悉的只是,让我们开始TS的类型挑战把~2022希望通过更文的方式来督促自己学习,每日三题,坚持日更不断~~
题目大纲
01. Easy Parameters
题目要求
import { Equal, Expect, ExpectFalse, NotEqual } from '@type-challenges/utils'
const foo = (arg1: string, arg2: number): void => {}
const bar = (arg1: boolean, arg2: {a: 'A'}): void => {}
const baz = (): void => {}
type cases = [
Expect<Equal<MyParameters<typeof foo>, [string, number]>>,
Expect<Equal<MyParameters<typeof bar>, [boolean, {a: 'A'}]>>,
Expect<Equal<MyParameters<typeof baz>, []>>,
]
我的答案
type MyParameters<T extends (...args: any[]) => any> = T extends (
...args: infer P
) => any
? P
: [];
知识点
infer关键字的使用,推断出对应参数的类型,这里如果...args: infer P这个时候推断出的P其实是一个数组类型,如果是...args: infer P[]这个时候的P就是个联合类型了
2. Medium Return Type
题目要求
import { Equal, Expect } from '@type-challenges/utils'
type cases = [
Expect<Equal<string, MyReturnType<() => string>>>,
Expect<Equal<123, MyReturnType<() => 123>>>,
Expect<Equal<ComplexObject, MyReturnType<() => ComplexObject>>>,
Expect<Equal<Promise<boolean>, MyReturnType<() => Promise<boolean>>>>,
Expect<Equal<() => 'foo', MyReturnType<() => () => 'foo'>>>,
Expect<Equal<1 | 2, MyReturnType<typeof fn>>>,
Expect<Equal<1 | 2, MyReturnType<typeof fn1>>>,
]
type ComplexObject = {
a: [12, 'foo']
bar: 'hello'
prev(): number
}
const fn = (v: boolean) => v ? 1 : 2
const fn1 = (v: boolean, w: any) => v ? 1 : 2
我的解答
type MyReturnType<T extends (...args: any[]) => any> = T extends (
...args: any[]
) => infer P
? P
: void;
知识点
infer的简单使用。
3. Medium Omit
题目要求
import { Equal, Expect } from '@type-challenges/utils'
type cases = [
Expect<Equal<Expected1, MyOmit<Todo, 'description'>>>,
Expect<Equal<Expected2, MyOmit<Todo, 'description' | 'completed'>>>
]
interface Todo {
title: string
description: string
completed: boolean
}
interface Expected1 {
title: string
completed: boolean
}
interface Expected2 {
title: string
}
我的解答
type MyEx<T, K> = T extends K ? never : T;
type MyOmit<T, K extends keyof T> = {
[key in MyEx<keyof T, K>]: T[key];
};
知识点
- 在
Mapped的语法中可以使用Exclude,Extract等泛型,将原本的联合类型得到处理,得到我们自己想要的类型