Skip to content

Commit

Permalink
Merge pull request #2 from zhuba-Ahhh/dev
Browse files Browse the repository at this point in the history
特性: ✨ git add 08-ts-utility_types content
  • Loading branch information
zhuba-Ahhh authored Apr 8, 2024
2 parents 9a60e72 + 3686f32 commit 05ea546
Show file tree
Hide file tree
Showing 19 changed files with 239 additions and 3 deletions.
4 changes: 1 addition & 3 deletions .github/workflows/pnpm.yml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
name: Bear-UI Pnpm
name: Pnpm

on:
push:
Expand All @@ -20,5 +20,3 @@ jobs:
run: pnpm install
- name: Jest
run: pnpm jest
# - name: Serve Docs
# run: pnpm docs:serve
8 changes: 8 additions & 0 deletions src/08-ts-utility_types/Awaited.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
// Awaited<Type>
// 这种类型旨在模拟 async 函数中的 await 之类的操作,或 Promise 上的 .then() 方法 - 特别是它们递归解包 Promise 的方式。

type A = Awaited<Promise<string>>;

type B = Awaited<Promise<Promise<number>>>;

type C1 = Awaited<boolean | Promise<number>>;
9 changes: 9 additions & 0 deletions src/08-ts-utility_types/ConstructorParameters.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
// ConstructorParameters<Type>
// 从构造函数类型的类型构造元组或数组类型。它生成一个包含所有参数类型的元组类型(如果 Type 不是函数,则生成类型 never)。

type T01 = ConstructorParameters<ErrorConstructor>;
type T11 = ConstructorParameters<FunctionConstructor>;
type T21 = ConstructorParameters<RegExpConstructor>;
type T31 = ConstructorParameters<any>;

type T41 = ConstructorParameters<Function>;
6 changes: 6 additions & 0 deletions src/08-ts-utility_types/Exclude.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
// Exclude<UnionType, ExcludedMembers>
// 通过从 UnionType 中排除所有可分配给 ExcludedMembers 的联合成员来构造一个类型。

type T02 = Exclude<"a" | "b" | "c", "a">;
type T12 = Exclude<"a" | "b" | "c", "a" | "b">;
type T22 = Exclude<string | number | (() => void), Function>;
5 changes: 5 additions & 0 deletions src/08-ts-utility_types/Extract.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
// Extract<Type, Union>
// 通过从 Type 中提取所有可分配给 Union 的联合成员来构造一个类型。

type T04 = Extract<"a" | "b" | "c", "a" | "f">;
type T14 = Extract<string | number | (() => void), Function>;
13 changes: 13 additions & 0 deletions src/08-ts-utility_types/InstanceType.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
// InstanceType<Type>
// 构造一个由 Type 中的构造函数的实例类型组成的类型。

class C {
x = 0;
y = 0;
}

type T0 = InstanceType<typeof C>;
type T1 = InstanceType<any>;
type T2 = InstanceType<never>;
type T3 = InstanceType<string>;
type T4 = InstanceType<Function>;
5 changes: 5 additions & 0 deletions src/08-ts-utility_types/NonNullable.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
// NonNullable<Type>
// 通过从 Type 中排除 null 和 undefined 来构造一个类型。

type T0 = NonNullable<string | number | undefined>;
type T1 = NonNullable<string[] | null | undefined>;
28 changes: 28 additions & 0 deletions src/08-ts-utility_types/Omit.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
// Omit<Type, Keys>
// 通过从 Type 中选择所有属性然后删除 Keys(字符串字面或字符串字面的并集)来构造一个类型。

interface Todo {
title: string;
description: string;
completed: boolean;
createdAt: number;
}

type TodoPreview = Omit<Todo, "description">;

const todo: TodoPreview = {
title: "Clean room",
completed: false,
createdAt: 1615544252770,
};

todo;

type TodoInfo = Omit<Todo, "completed" | "createdAt">;

const todoInfo: TodoInfo = {
title: "Pick up kids",
description: "Kindergarten closes at 5pm",
};

todoInfo;
10 changes: 10 additions & 0 deletions src/08-ts-utility_types/OmitThisParameter.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
// OmitThisParameter<Type>
// 从 Type 中删除 this 参数。如果 Type 没有显式声明的 this 参数,则结果只是 Type。否则,将从 Type 创建一个没有 this 参数的新函数类型。泛型被删除,只有最后一个重载签名被传播到新的函数类型中。

function toHex(this: Number) {
return this.toString(16);
}

const fiveToHex: OmitThisParameter<typeof toHex> = toHex.bind(5);

console.log(fiveToHex());
13 changes: 13 additions & 0 deletions src/08-ts-utility_types/Parameters.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
// Parameters<Type>
// 从函数类型 Type 的参数中使用的类型构造元组类型。

declare function f1(arg: { a: number; b: string }): void;

type T0 = Parameters<() => string>;
type T1 = Parameters<(s: string) => void>;
type T2 = Parameters<<T>(arg: T) => T>;
type T3 = Parameters<typeof f1>;
type T4 = Parameters<any>;
type T5 = Parameters<never>;
type T6 = Parameters<string>;
type T7 = Parameters<Function>;
20 changes: 20 additions & 0 deletions src/08-ts-utility_types/Partial.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
// Partial<Type>
// 构造一个将 Type 的所有属性设置为可选的类型。此实用程序将返回一个表示给定类型的所有子集的类型。

interface Todo {
title: string;
description: string;
}

function updateTodo(todo: Todo, fieldsToUpdate: Partial<Todo>) {
return { ...todo, ...fieldsToUpdate };
}

const todo1:Todo = {
title: "organize desk",
description: "clear clutter",
};

const todo2 = updateTodo(todo1, {
description: "throw out trash",
});
17 changes: 17 additions & 0 deletions src/08-ts-utility_types/Pick.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
// Pick<Type, Keys>
// 通过从 Type 中选取一组属性 Keys(字符串字面或字符串字面的并集)来构造一个类型。

interface Todo3 {
title: string;
description: string;
completed: boolean;
}

type TodoPreview1 = Pick<Todo3, "title" | "completed">;

const todo4: TodoPreview1 = {
title: "Clean room",
completed: false,
};

todo;
16 changes: 16 additions & 0 deletions src/08-ts-utility_types/Readonly.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
// Readonly<Type>
// 构造一个将 Type 的所有属性设置为 readonly 的类型,这意味着构造类型的属性不能重新分配。

interface Todo2 {
title: string;
}

const todo3: Readonly<Todo2> = {
title: "Delete inactive users",
};

todo3.title = "Hello";


// Object.freeze
// function freeze<Type>(obj: Type): Readonly<Type>;
17 changes: 17 additions & 0 deletions src/08-ts-utility_types/Record.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
// Record<Keys, Type>
// 构造一个对象类型,其属性键为 Keys,其属性值为 Type。此实用程序可用于将一种类型的属性映射到另一种类型。

interface CatInfo {
age: number;
breed: string;
}

type CatName = "miffy" | "boris" | "mordred";

const cats: Record<CatName, CatInfo> = {
miffy: { age: 10, breed: "Persian" },
boris: { age: 5, breed: "Maine Coon" },
mordred: { age: 16, breed: "British Shorthair" },
};

cats.boris;
12 changes: 12 additions & 0 deletions src/08-ts-utility_types/Required.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
// // Required<Type>
// 构造一个由设置为 required 的 Type 的所有属性组成的类型。与Partial相反。

interface Props {
a?: number;
b?: string;
}

const obj: Props = { a: 5 };

const obj2: Required<Props> = { a: 5 };
// Property 'b' is missing in type '{ a: number; }' but required in type 'Required<Props>'.
14 changes: 14 additions & 0 deletions src/08-ts-utility_types/ReturnType.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
// ReturnType<Type>
// 构造一个由函数 Type 的返回类型组成的类型。

declare function f1(): { a: number; b: string };

type T0 = ReturnType<() => string>;
type T1 = ReturnType<(s: string) => void>;
type T2 = ReturnType<<T>() => T>;
type T3 = ReturnType<<T extends U, U extends number[]>() => T>;
type T4 = ReturnType<typeof f1>;
type T5 = ReturnType<any>;
type T6 = ReturnType<never>;
type T7 = ReturnType<string>;
type T8 = ReturnType<Function>;
10 changes: 10 additions & 0 deletions src/08-ts-utility_types/ThisParameterType.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
// ThisParameterType<Type>
// 提取函数类型的 此 参数的类型,如果函数类型没有 this 参数,则提取 未知。

function toHex(this: Number) {
return this.toString(16);
}

function numberToString(n: ThisParameterType<typeof toHex>) {
return toHex.apply(n);
}
30 changes: 30 additions & 0 deletions src/08-ts-utility_types/ThisType.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
// ThisType<Type>
// 此实用程序不返回转换后的类型。相反,它用作上下文 this 类型的标记。请注意,必须启用 noImplicitThis 标志才能使用此实用程序。

type ObjectDescriptor<D, M> = {
data?: D;
methods?: M & ThisType<D & M>; // Type of 'this' in methods is D & M
};

function makeObject<D, M>(desc: ObjectDescriptor<D, M>): D & M {
let data: object = desc.data || {};
let methods: object = desc.methods || {};
return { ...data, ...methods } as D & M;
}

let obj = makeObject({
data: { x: 0, y: 0 },
methods: {
moveBy(dx: number, dy: number) {
this.x += dx; // Strongly typed this
this.y += dy; // Strongly typed this
},
},
});

obj.x = 10;
obj.y = 20;
obj.moveBy(5, 5);
// 在上面的示例中,makeObject 参数中的 methods 对象具有包含 ThisType<D & M> 的上下文类型,因此 methods 对象内的方法中的 此 类型是 { x: number, y: number } & { moveBy(dx: number, dy: number): number }。请注意 methods 属性的类型如何同时是方法中 this 类型的推理目标和源。

// ThisType<T> 标记接口只是在 lib.d.ts 中声明的一个空接口。除了在对象字面的上下文类型中被识别之外,接口的行为就像任何空接口。
5 changes: 5 additions & 0 deletions src/08-ts-utility_types/内在字符串操作类型.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
// 内在字符串操作类型
// Uppercase<StringType>
// Lowercase<StringType>
// Capitalize<StringType>
// Uncapitalize<StringType>中英

0 comments on commit 05ea546

Please sign in to comment.