Skip to content

Commit

Permalink
更新;
Browse files Browse the repository at this point in the history
  • Loading branch information
simply-none committed Jul 5, 2022
1 parent 3f27f96 commit 264f240
Show file tree
Hide file tree
Showing 4 changed files with 65 additions and 4 deletions.
1 change: 1 addition & 0 deletions _sidebar.md
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
- typescript
- [第一阶段知识点](usage-frame/typescript一期知识点.md)
- [第二阶段知识点](usage-frame/typescript二期知识点.md)
- [奇怪或有用的代码](usage-frame/typescript-code.md)

- 代码片段
- [electron](code-frames/electron.md)
Expand Down
28 changes: 28 additions & 0 deletions usage-frame/typescript-code.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
# typescript奇怪的代码

```typescript
// 1:赋值
interface StringValidator {
isAcceptable (s: string): boolean;
}

class LettersOnlyValidator implements StringValidator {
isAcceptable (s: string) {
return /^[0-9]+$/.test(s)
}
}

let validators: { [s: string]: StringValidator } = {}
validators['letters only'] = new LettersOnlyValidator()

for (let name in validators) {
let isMatch = validators[name].isAcceptable('23456')
}

// 2. 泛型套娃
type OrNull<T> = T | null
type OneOrMany<T> = T | T[]
// 右侧类似于OrNull<T | T[]>,即T | T[] | null
type OneOrManyOrNull<T> = OrNull<OneOrMany<T>>

```
23 changes: 20 additions & 3 deletions usage-frame/typescript一期知识点.md
Original file line number Diff line number Diff line change
Expand Up @@ -373,7 +373,7 @@ function assertNever (x: never): never {
- 使用方式:`keyof T`,其结果为T上已知的公共*属性名*的联合,当T的属性自动增减时,其结果也会自动增减
索引访问操作符:
- 使用方式:`T[K]`,表示T的属性K的值,表示一种类型,其中需结合`K extends keyof T`来使用
- 使用方式:`T[K]`或者`T[K1 | K2]`,表示T的属性K的值,表示一种类型,其中需满足`K extends keyof T`,并且K是一个类型,而非一个值
索引签名:
- 指的是类似接口中的属性名,但是其属性名不是确切的,使用方式为`[key: string]: T`,当类型不正确时,报错An index signature parameter type must be 'string', 'number', 'symbol', or a template literal type.
Expand Down Expand Up @@ -1502,11 +1502,11 @@ myGenericNumber.add = function(x, y) { return x + y; };
```
<!-- tabs:end -->
泛型约束:定义一个接口来描述约束条件,让泛型继承这个接口实现约束。在定义了约束的泛型中,只适用于符合约束类型的值
泛型约束:定义一个接口来描述约束条件,让泛型继承这个接口实现约束。在定义了约束的泛型之后,传入的值必须要兼容这个约束类型
在泛型约束中使用类型参数:声明一个类型参数,其被另一个类型参数所约束
在泛型中使用类类型:😢😢😢
在泛型中使用类类型:😢😢😢类类型语法为`new (x: number) => Point`等同于`{ new (x: number): Point }`,表示返回一个包含类型为Point的构造函数的对象类型,默认类的构造函数类型为其本身
<!-- tabs:start -->
Expand Down Expand Up @@ -1538,4 +1538,21 @@ let x = { a: 1, b: 2, c: 3, d: 4 };
getProperty(x, "a"); // okay
getProperty(x, "m"); // error: Argument of type 'm' isn't assignable to 'a' | 'b' | 'c' | 'd'.
```
<!-- tab:在泛型约束中使用类类型 -->
```typescript
function createInstance<A extends Animal>(c: new () => A): A {
return new c()
}
class Animal {
}
class Bee extends Animal {
Keeper: BeeKeeper = new BeeKeeper()
}
class BeeKeeper {
hasMask: boolean = false
}
createInstance(Bee).Keeper.hasMask
```
<!-- tabs:end -->
17 changes: 16 additions & 1 deletion usage-frame/typescript略纪.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,4 +13,19 @@

声明分类:命名空间、类型、值

接口合并,后者优先级更高(展示顺序居前,若函数成员参数签名有单一的字符串字面量类型时,会提升至最前面)。相同的非函数成员须有相同类型,否则报错;同名函数成员会成为函数的重载。
接口合并,后者优先级更高(展示顺序居前,若函数成员参数签名有单一的字符串字面量类型时,会提升至最前面)。相同的非函数成员须有相同类型,否则报错;同名函数成员会成为函数的重载。

## 泛型

根据类型创建类型:type,keyof,typeof,条件类型,索引访问类型,

条件类型:结合泛型使用,可避免过多的函数重载操作

```typescript
// 条件类型
type NameOrId<T extends number | string> = T extends number ? IdLabel : NameLabel

function createLabel<T extends number | string>(idOrName: T): NameOrId<T> {
throw ''
}
```

0 comments on commit 264f240

Please sign in to comment.