diff --git a/docs/about.md b/docs/about.md index bb25e03..d86d513 100644 --- a/docs/about.md +++ b/docs/about.md @@ -1,14 +1,3 @@ - - # 关于本站 ## 符号标记 @@ -20,6 +9,7 @@ - 😢:表示尚未搞懂的内容 - ⛔:阅读中断标志 - 🔴:重点、易混淆、难以理解的内容 +- 【📗注:xxx】:再读时的注释、理解 ## 内容解释 diff --git "a/docs/usage-frame/typescript/typescript\344\270\200\346\234\237\347\237\245\350\257\206\347\202\271.md" "b/docs/usage-frame/typescript/typescript\344\270\200\346\234\237\347\237\245\350\257\206\347\202\271.md" index 6565290..b17f709 100644 --- "a/docs/usage-frame/typescript/typescript\344\270\200\346\234\237\347\237\245\350\257\206\347\202\271.md" +++ "b/docs/usage-frame/typescript/typescript\344\270\200\346\234\237\347\237\245\350\257\206\347\202\271.md" @@ -708,14 +708,14 @@ if (sym1 === sym2) {} 通俗理解:交叉类型,将多个类型合并为一个类型,包含了所有类型的特性(属性),同时拥有所有类型的成员(属性) -定义:使用 `&`分隔类型,一般用于联合类型、接口交叉,若两者之间无交集,则该值为never类型 +定义:使用 `&`分隔类型,一般用于联合类型、接口交叉,若两者之间无交集,则该值为never类型【📗注:对于联合类型的交叉,返回相同部分,无相同部分返回never;对于接口的交叉,返回两接口的所有属性类型,对于存在的共有属性,属性类型为对象形式,参考接口交叉,属性类型为单类型,参考联合类型的交叉】 使用: - 交叉类型**常用来定义公共的部分** - 原子类型合并成交叉类型,得到的类型是never,因为不能同时满足这些原子类型 - 交叉类型常用于将多个接口类型合并为一个类型,等同于接口继承(合并接口类型) -- 🔴若接口交叉时,属性相同,属性类型不相同,则合并的接口类型可以是never(原始值属性合并),也可以是相同属性为never类型的对象类型(对象属性合并);比如类型分别为string和boolean的属性x,交叉合并后,则合并的类型是never类型(这里是原始值属性),若属性x是一个对象,对象下分别包含类型为string和boolean的属性d,则合并后的类型是never或{ x: never }(这里是对象属性) +- 🔴若接口交叉时,属性相同,属性类型不相同,则合并的接口类型可以是never(原始值属性合并),也可以是共有属性为never类型的对象类型(对象属性合并) ```typescript // 普通类型交叉,无交集,类型为never @@ -780,19 +780,44 @@ let abc: ABC = { } }; +// 🔴若接口交叉时,属性相同,属性类型不相同【📗注】 +// 属性的类型为原始类型 +interface X { + a: string; +} + +interface Y { + a: boolean; +} + +type XY = X & Y; + +// XY:never +let xy: XY = 1 as never + +// 属性的类型包含对象类型 +interface XX { + a: { + c: number; + } +} + +interface YY { + a: { + c: string; + } + +// XY: never;XY: { a: never } +let xy: XY = 1 as never; +let xy2: XY = { a: 1 as never }; ``` ### 联合类型 -通俗理解:联合类型,即 `存异`,可以是某种类型,也可以是另一种类型;是多个类型中的某一个(可以只满足一种类型即可),只能访问所有类型的共有属性 +通俗理解:联合类型,即多个类型中的某一个。【📗注:即类型A和类型B联合,只需要满足A,或者满足B就行了】。在使用类型推断之前,只能访问所有类型的共有属性 定义:union,使用 `|`分隔类型 `string | number`,其值可以是声明类型的某一种 `string`或者 `number`。 -使用: - -- 当不能(用类型推断)确定联合类型属于某一具体类型时,只能访问所有类型共有方法/属性。 -- 只有确定具体类型 `if (typeof xxx === 'number') { xxx.toFixed() }`之后(比如使用条件语句、类型推断),才能访问特定类型的方法/属性 - ```typescript // 对于变量的联合 type A = string | number; @@ -817,17 +842,17 @@ let xy: XY = { } ``` -类型缩减:typescript会把字面量类型和枚举成员类型缩减掉,只剩下原始类型和枚举类型 +类型缩减:typescript会把字面量类型和枚举成员类型缩减掉,只剩下原始类型和枚举类型【📗注:两个类型联合,若类型A包含类型B,则联合后的类型为A】 ```typescript -// A的类型是string,因为string包括了'a'字面量类型的所有字面量 +// A:string,因为string包括了'a'字面量类型的所有字面量 type A = 'a' | string; enum U { A, B } -// UU的类型是U,因为U包括了枚举成员类型U.A +// UU:U,因为U包括了枚举成员类型U.A type UU = U.A | U ``` @@ -862,7 +887,7 @@ let b: AorB = { ``` -#### 可辨识联合 +#### 🟢可辨识联合 定义:同时使用单例类型、联合类型、类型守卫、类型别名这些语法概念,然后创建一个可辨识联合的高级模式,也叫做标签联合或代数数据联合 @@ -1025,7 +1050,7 @@ let value: Disctionary[42] - 映射类型是一种泛型类型,使用(通常是通过keyof创建的)键的联合,从而遍历键创建一个新类型 - 映射类型类似一个函数,将一个类型,通过该函数(映射类型)转换成新的类型 - 映射类型基于索引签名 `[ xxx ]: type;` -- 映射修饰符:`readonly`、`?`,可配合 `+`(默认), `-`使用 +- 映射修饰符:`readonly`、`?`,可配合 `+`(默认), `-`使用,用法为`+?`, `-readonly` - 可通过as重新映射类型中的键 注意: @@ -1396,7 +1421,7 @@ type C = Awaited> **typeof**: -定义: +定义:`typeof valueAlias` - 获取右侧标识符(变量或属性值)的类型 - 对于获取有些表达式、函数调用、类型的类型会报错,即不能使用typeof XXX的形式 @@ -1425,7 +1450,7 @@ type pType = typeof p **keyof**: -定义: +定义:`keyof Type` - 生成对象类型的键的string、number字面量类型的联合 @@ -1636,7 +1661,7 @@ const obj3 = { - 泛型中的类型参数,若是结构中的内容与类型参数无关,只要两个泛型结构兼容,则类型参数的类型不会影响两者兼容性 - 泛型的表示不同,只要结构类型都相同,也是不影响兼容的,比如泛型T和泛型U -子类型和赋值:typescript有两者兼容性的方式,就是子类型和赋值 +子类型和赋值:typescript有两种兼容性的方式,就是子类型和赋值 - 赋值扩展了子类型的兼容性,增加了一些规则,允许和any来回赋值,以及enum和number来回赋值 - 类型兼容性实际上是由赋值兼容性控制,即使是在implements和extends语句中😢😢😢