Skip to content
Permalink

Comparing changes

Choose two branches to see what’s changed or to start a new pull request. If you need to, you can also or learn more about diff comparisons.

Open a pull request

Create a new pull request by comparing changes across two branches. If you need to, you can also . Learn more about diff comparisons here.
base repository: dalian-js/typescript-tutorial
Failed to load repositories. Confirm that selected base ref is valid, then try again.
Loading
base: main
Choose a base ref
...
head repository: wangdoc/typescript-tutorial
Failed to load repositories. Confirm that selected head ref is valid, then try again.
Loading
compare: main
Choose a head ref
Able to merge. These branches can be automatically merged.
  • 8 commits
  • 6 files changed
  • 1 contributor

Commits on Sep 23, 2024

  1. docs(assert): fixed wangdoc#119

    ruanyf committed Sep 23, 2024
    Copy the full SHA
    b376397 View commit details
  2. Copy the full SHA
    f68cdbc View commit details

Commits on Sep 29, 2024

  1. docs(enum): fixed wangdoc#122

    ruanyf committed Sep 29, 2024
    Copy the full SHA
    5c56fd5 View commit details

Commits on Oct 3, 2024

  1. Copy the full SHA
    e7e1a77 View commit details
  2. docs(declare): edit text

    ruanyf committed Oct 3, 2024
    Copy the full SHA
    5361b8c View commit details

Commits on Oct 12, 2024

  1. Copy the full SHA
    635a5fa View commit details

Commits on Oct 15, 2024

  1. Copy the full SHA
    1725cbb View commit details

Commits on Dec 31, 2024

  1. docs(operator): fixed typo

    ruanyf committed Dec 31, 2024
    Copy the full SHA
    1f5e929 View commit details
Showing with 56 additions and 38 deletions.
  1. +1 −10 docs/assert.md
  2. +12 −0 docs/declare.md
  3. +1 −1 docs/enum.md
  4. +10 −11 docs/operator.md
  5. +31 −15 docs/tsconfig.json.md
  6. +1 −1 package.json
11 changes: 1 addition & 10 deletions docs/assert.md
Original file line number Diff line number Diff line change
@@ -490,18 +490,9 @@ function assertIsDefined<T>(

上面示例中,工具类型`NonNullable<T>`对应类型`T`去除空类型后的剩余类型。

如果要将断言函数用于函数表达式,可以采用下面的写法。
如果要将断言函数用于函数表达式,可以采用下面的写法。根据 TypeScript 的[要求](https://github.com/microsoft/TypeScript/pull/33622#issuecomment-575301357),这时函数表达式所赋予的变量,必须有明确的类型声明。

```typescript
// 写法一
const assertIsNumber = (
value:unknown
):asserts value is number => {
if (typeof value !== 'number')
throw Error('Not a number');
};

// 写法二
type AssertIsNumber =
(value:unknown) => asserts value is number;

12 changes: 12 additions & 0 deletions docs/declare.md
Original file line number Diff line number Diff line change
@@ -252,6 +252,7 @@ const a:A = { x: 0, y: 0 };
某些第三方模块,原始作者没有提供接口类型,这时可以在自己的脚本顶部加上下面一行命令。

```typescript
// 语法
declare module "模块名";

// 例子
@@ -371,6 +372,17 @@ declare module "path" {

上面示例中,`url``path`都是单独的模块脚本,但是它们的类型都定义在`node.d.ts`这个文件里面。

另一种情况是,使用`declare module`命令,为模块名指定加载路径。

```typescript
declare module "lodash" {
export * from "../../dependencies/lodash";
export default from "../../dependencies/lodash";
}
```

上面示例中,`declare module "lodash"`为模块`lodash`,指定具体的加载路径。

使用时,自己的脚本使用三斜杠命令,加载这个类型声明文件。

```typescript
2 changes: 1 addition & 1 deletion docs/enum.md
Original file line number Diff line number Diff line change
@@ -312,7 +312,7 @@ enum Foo {
// 等同于
enum Foo {
A,
B = 1
B = 1,
C = 2
}
```
21 changes: 10 additions & 11 deletions docs/operator.md
Original file line number Diff line number Diff line change
@@ -378,18 +378,17 @@ type T2 = RegExp extends Animal ? number : string;

一般来说,调换`extends`两侧类型,会返回相反的结果。举例来说,有两个类`Cat``Animal`,前者是后者的子类型,那么`Cat extends Animal`就为真,而`Animal extends Cat`就为伪。

如果需要判断的类型是一个联合类型,那么条件运算符会展开这个联合类型
如果对泛型使用 extends 条件运算,有一个地方需要注意。当泛型的类型参数是一个联合类型时,那么条件运算符会展开这个类型参数,即`T<A|B> = T<A> | T<B>`,所以 extends 对类型参数的每个部分是分别计算的

```typescript
(A|B) extends U ? X : Y
type Cond<T> = T extends U ? X : Y;

// 等同于

(A extends U ? X : Y) |
(B extends U ? X : Y)
type MyType = Cond<A|B>;
// 等同于 Cond<A> | Cond<B>
// 等同于 (A extends U ? X : Y) | (B extends U ? X : Y)
```

上面示例中,`A|B`是一个联合类型,进行条件运算时,相当于`A``B`分别进行运算符,返回结果组成一个联合类型。
上面示例中,泛型`Cond`的类型参数`A|B`是一个联合类型,进行条件运算时,相当于`A``B`分别进行条件运算,返回结果组成一个联合类型。也就是说,如果类型参数是联合类型,条件运算的返回结果依然是一个联合类型

如果不希望联合类型被条件运算符展开,可以把`extends`两侧的操作数都放在方括号里面。

@@ -398,18 +397,18 @@ type T2 = RegExp extends Animal ? number : string;
type ToArray<Type> =
Type extends any ? Type[] : never;

// string[]|number[]
// 返回结果 string[]|number[]
type T = ToArray<string|number>;

// 示例二
type ToArray<Type> =
[Type] extends [any] ? Type[] : never;

// (string | number)[]
// 返回结果 (string | number)[]
type T = ToArray<string|number>;
```

上面的示例一,传入`ToArray<Type>`的类型参数是一个联合类型,所以会被展开,返回的也是联合类型。示例二是`extends`两侧的运算数都放在方括号里面,所以传入的联合类型不会展开,返回的是一个数组。
上面的示例一,泛型`ToArray<Type>`的类型参数`string|number`是一个联合类型,所以会被展开,返回的也是联合类型`string[]|number[]`。示例二是`extends`两侧的运算数都放在方括号里面,左侧是`[Type]`,右侧是`[any]`,这时传入的联合类型不会展开,返回的是一个数组`(string|number)[]`

条件运算符还可以嵌套使用。

@@ -661,7 +660,7 @@ const palette: Record<Colors, string|RGB> = {
const greenComponent = palette.green.substring(1, 6); // 报错
```

上面示例中,`palette.green`属性调用`substring()`方法会报错,原因是这个方法只有字符串才有,而`palette.green`的类型是`srting|RGB`,除了字符串,还可能是元组`RGB`,而元组并不存在`substring()`方法,所以报错了。
上面示例中,`palette.green`属性调用`substring()`方法会报错,原因是这个方法只有字符串才有,而`palette.green`的类型是`string|RGB`,除了字符串,还可能是元组`RGB`,而元组并不存在`substring()`方法,所以报错了。

如果要避免报错,要么精确给出变量`palette`每个属性的类型,要么对`palette.green`的值进行类型缩小。两种做法都比较麻烦,也不是很有必要。

46 changes: 31 additions & 15 deletions docs/tsconfig.json.md
Original file line number Diff line number Diff line change
@@ -536,7 +536,9 @@ TypeScript 内置的类型描述文件,主要有以下一些,完整的清单
}
```

它还可以使用通配符“*”。
上面示例中,paths 设置的是执行`require('b')`时,即加载的是`./bar/b`

它还可以使用通配符“*”,表明模块名与模块位置的对应关系。

```typescript
{
@@ -677,28 +679,42 @@ let func:StringOrNumberFunc = fn;

### strictNullChecks

`strictNullChecks`设置对`null``undefined`进行严格类型检查。如果打开`strict`属性,这一项就会自动设为`true`,否则为`false`
不打开`strictNullChecks`的情况下,一个变量不管类型是什么,都可以赋值为`undefined``null`

```bash
let value:string;
```typescript
// 不打开 strictNullChecks 的情况
let x:number;

// strictNullChecks:false
// 下面语句不报错
value = null;
x = undefined; // 不报错
x = null; // 不报错
```

它可以理解成只要打开,就需要显式检查`null``undefined`
上面示例中,不打开`strictNullChecks`时,变量`x`的类型是`number`,但是赋值为`undefined``null`都不会报错。这是为了继承 JavaScript 的设定:当变量没有赋值时,它的值就为`undefined`

一旦打开`strictNullChecks`,就使用严格类型,禁止变量赋值为`undefined``null`,除非变量原本就是这两种类型。它相当于从变量的值里面,排除了`undefined``null`

```typescript
function doSomething(x:string|null) {
if (x === null) {
// do nothing
} else {
console.log("Hello, " + x.toUpperCase());
}
}
// 打开 strictNullChecks 的情况
let x:number;

x = undefined; // 报错
x = null; // 报错
```

上面示例中,打开`strictNullChecks`时,变量`x`作为`number`类型,就不能赋值为`undefined``null`

下面是一个例子。

```typescript
// 打开 strickNullChecks 时,类型 A 为 number
// 不打开时,类型 A 为 string
type A = unknown extends {} ? string : number;
```

上面示例中,`{}`代表了 Object 类型,不打开`strictNullChecks`时,它包括了`undefined``null`,就相当于包括了所有类型的值,所以这时`unknown`类型可以赋值给`{}`类型,类型`A`就为`string`。打开`strictNullChecks`时,`{}`就排除掉了`undefined``null`,这时`unknown`类型就不能赋值给`{}`类型后,类型`A`就为`number`

最后,`strict`属性包含了`strictNullChecks`,如果打开`strict`属性,就相当于打开了`strictNullChecks`

### strictPropertyInitialization

`strictPropertyInitialization`设置类的实例属性都必须初始化,包括以下几种情况。
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -22,6 +22,6 @@
"dependencies": {
"gh-pages": "6.x",
"loppo": "^0.6.25",
"loppo-theme-wangdoc": "^0.7.1"
"loppo-theme-wangdoc": "^0.7.3"
}
}