-
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.
- Loading branch information
1 parent
3aa2a59
commit ee92bd3
Showing
14 changed files
with
336 additions
and
103 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
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,42 @@ | ||
## 泛型约束 | ||
|
||
```typescript | ||
interface Person { | ||
name: string; | ||
} | ||
// extends:扩展;延长;扩大;使延期;使伸长;扩大…的范围(或影响),extend的第三人称单数 | ||
// 即通过extends关键字可以对类型进行进一步拓展约束范围 | ||
// 简单的理解,就是“使...必须包含....”, 则接收的类型参数T,必须包含类型Person所要求的 | ||
const test = <T extends Person>(str: T) => str; | ||
test({ name: 'Awen' }); // Ok name是必传的 | ||
test({ name: 'Awen', age: 666 }); // Ok,age是额外传递的,即使类型Person不要求age参数 | ||
``` | ||
|
||
```typescript | ||
type Msg<T> = T extends { msg: unknown } ? T['msg'] : never; | ||
const msg1: Msg<{ msg: string }> = '666'; | ||
const msg2: Msg<{ msg: number }> = 666; | ||
const msg: Msg<{ msg: '你好啊' }> = '你好啊'; | ||
``` | ||
|
||
```typescript | ||
type Square = { | ||
kind: 'square'; | ||
x: number; | ||
y: number; | ||
}; | ||
type Circle = { | ||
kind: 'circle'; | ||
radius: number; | ||
}; | ||
|
||
type GeneratorKindFunction<T extends { kind: string }> = { | ||
[K in T['kind']]: (obj: T extends { kind: K } ? T : never) => number; | ||
}; | ||
type newType = GeneratorKindFunction<Square | Circle>; | ||
|
||
/** | ||
* type newType = { square: (str: Square) => number; circle: (obj: Circle) => 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,62 @@ | ||
## 类型保护工具函数 | ||
|
||
```typescript | ||
export function isString(value: unknown): value is string { | ||
return typeof value === 'string'; | ||
} | ||
|
||
export function isNumber(value: unknown): value is number { | ||
return typeof value === 'number'; | ||
} | ||
|
||
export function isBoolean(value: unknown): value is boolean { | ||
return typeof value === 'boolean'; | ||
} | ||
|
||
export function isFunction(value: unknown): value is Function { | ||
return typeof value === 'function'; | ||
} | ||
|
||
export function isObject(value: unknown): value is object { | ||
return value !== null && typeof value === 'object'; | ||
} | ||
|
||
export function isArray(value: unknown): value is unknown[] { | ||
return Array.isArray(value); | ||
} | ||
|
||
export function isDate(value: unknown): value is Date { | ||
return value instanceof Date; | ||
} | ||
|
||
export function isPromise(value: unknown): value is Promise<any> { | ||
return ( | ||
!!value && | ||
typeof value === 'object' && | ||
typeof (value as Promise<any>).then === 'function' | ||
); | ||
} | ||
|
||
export function isSymbol(value: unknown): value is symbol { | ||
return typeof value === 'symbol'; | ||
} | ||
|
||
export function isUndefined(value: unknown): value is undefined { | ||
return value === undefined; | ||
} | ||
|
||
export function isNull(value: unknown): value is null { | ||
return value === null; | ||
} | ||
|
||
export function isBigInt(value: unknown): value is BigInt { | ||
return typeof value === 'bigint'; | ||
} | ||
|
||
export function isInstanceOf<T>( | ||
value: unknown, | ||
constructor: new (...args: any[]) => T | ||
): value is T { | ||
return value instanceof constructor; | ||
} | ||
``` |
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,41 @@ | ||
## 联合类型和交叉类型理解 | ||
|
||
> 这里,我个人的一个理解, | ||
> | ||
> 联合类型:`type C = A | B | .....`。那么类型C需要满足的条件是符合类型(**A 、 B 、 .....**)中的一项约束即可,也可满足n项约束。可以理解为 T extends A|B|C|D.....Z | ||
> | ||
> 交叉类型:`type D = A & B & .....`。那么类型D需要满足的条件是符合类型(**自类型A开始到最后一项**)中的每一项类型的约束,可以理解为(((((T extends A) extends B) extends C) extends D).....) extends Z, 即`<T extends A & B & C & .... & Z>` | ||
### 联合类型 (Union Types): | ||
|
||
* 联合类型表示一个变量可以具有多个类型中的一个。使用 | 符号将各个类型分隔开,例如 type1 | type2 | type3。 | ||
|
||
* 联合类型适用于在特定场景中可能是多种类型的变量或参数。 | ||
|
||
* 使用联合类型时,您需要注意以下几点: | ||
|
||
* 联合类型只能访问共同的属性和方法。即只能操作每个类型可能具有的公共成员。 | ||
* 当对一个联合类型的变量进行操作时,只能使用所有可能类型的共有成员。这意味着可能需要使用类型断言(Type Assertion)来告诉编译器您正在操作的是某个具体的类型。或者使用类型保护机制,如类型谓词、typeof 检查、instanceof 检查等。 | ||
* 联合类型的值在使用时可能存在不确定性,因此需要再次检查和处理不同类型的值。 | ||
|
||
### 交叉类型 (Intersection Types): | ||
|
||
* 交叉类型表示一个值具有多个类型的属性和方法。使用 & 符号将多个类型合并在一起,例如 type1 & type2 & type3。 | ||
|
||
* 交叉类型适用于需要同时满足多个类型特征的情况。 | ||
|
||
* 使用交叉类型时,您需要注意以下几点: | ||
|
||
* 交叉类型允许对象同时具备多个类型所定义的属性和方法。 | ||
* 当您使用交叉类型时,您可以直接访问所有类型的成员,而无需进行类型断言或类型保护。 | ||
* 如果交叉类型的多个类型具有相同的属性,属性的类型将是联合类型。例如,如果一个类型具有属性 a 的类型为 number,而另一个类型具有属性 a 的类型为 string,则交叉类型中的属性 a 的类型将为 number | string。 | ||
|
||
* 下面是一些使用联合类型和交叉类型时的注意事项: | ||
|
||
* 联合类型和交叉类型可以用于类型声明和类型别名。 | ||
|
||
* 在实际使用中,请确保合理并准确地定义联合类型和交叉类型,以避免类型错误。 | ||
|
||
* 对于联合类型,请确定您已经正确处理了所有可能的类型取值,并在必要时进行类型检查和处理。 | ||
|
||
* 对于交叉类型,请确保所组合的类型在逻辑上兼容,并且您需要的属性和方法在每个类型中都存在。 |
Oops, something went wrong.