typescript系列-Typechallenge-中等

答案参考:https://ghaiklor.github.io/type-challenges-solutions/zh/

获取函数返回类型

题目链接:https://github.com/type-challenges/type-challenges/blob/master/questions/2-medium-return-type/README.zh-CN.md

不使用 ReturnType 实现 TypeScript 的 ReturnType<T> 泛型。

ReturnType<Type>:构造函数的返回类型;

用法

declare function f1(): { a: number; b: string };
 
type T0 = ReturnType<() => string>;
     // type T0 = string
type T1 = ReturnType<(s: string) => void>;
     // type T1 = void
type T2 = ReturnType<<T>() => T>;
     // type T2 = unknown
type T3 = ReturnType<<T extends U, U extends number[]>() => T>;
     // type T3 = number[]
type T4 = ReturnType<typeof f1>;
     // type T4 = {
		 //    a: number;
		 //    b: string;
		 // }
type T5 = ReturnType<any>;
     // type T5 = any
type T6 = ReturnType<never>;
     // type T6 = never

其他实现方式

const fn = (v: boolean) => {
  if (v)
    return 1
  else
    return 2
}

type a = MyReturnType<typeof fn> // 应推导出 "1 | 2"

实现 Omit

题目链接:https://github.com/type-challenges/type-challenges/blob/master/questions/3-medium-omit/README.zh-CN.md

不使用 Omit 实现 TypeScript 的 Omit<T, K> 范型。

Omit 会创建一个省略 K 中字段的 T 对象。

Omit<T, K>:删除类型中的某个属性来构造一个新类型。

用法

type TodoInfo = Omit<Todo, "completed" | "createdAt">;
 
const todoInfo: TodoInfo = {
  title: "Pick up kids",
  description: "Kindergarten closes at 5pm",
};

其他实现方式

例如:

interface Todo {
  title: string
  description: string
  completed: boolean
}

type TodoPreview = MyOmit<Todo, 'description' | 'title'>

const todo: TodoPreview = {
  completed: false,
}

// ====================================================
// 实现
type MyOmit<T, K> = {
  [key in keyof T as Exclude<key, K>]: T[key]
}

参考链接:https://www.typescriptlang.org/docs/handbook/2/mapped-types.html#key-remapping-via-as