typescript系列-Typechallenge-中等
答案参考:https://ghaiklor.github.io/type-challenges-solutions/zh/
获取函数返回类型
不使用 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
不使用 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