-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #2 from zhuba-Ahhh/dev
特性: ✨ git add 08-ts-utility_types content
- Loading branch information
Showing
19 changed files
with
239 additions
and
3 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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>>; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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>; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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>; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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>; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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>; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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>; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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()); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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>; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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", | ||
}); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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>; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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>'. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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>; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 中声明的一个空接口。除了在对象字面的上下文类型中被识别之外,接口的行为就像任何空接口。 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,5 @@ | ||
// 内在字符串操作类型 | ||
// Uppercase<StringType> | ||
// Lowercase<StringType> | ||
// Capitalize<StringType> | ||
// Uncapitalize<StringType>中英 |