枚举

异构枚举: 成员值类型不同

联合枚举与枚举成员的类型:枚举值可以成为类型
反向枚举: a = Enum.A; value = Enum[a] 枚举对象值为KEY,KEY为值
常量枚举: 加个 const, 不允许计算成员,且在编译阶段删除

外部枚举 描述已经存在的枚举类型的形状。

类型推论

最佳通用类型

  1. let zoo = [new Rhino(), new Elephant(), new Snake()];
  2. // 根据三个元素综合得出 (Rhino | Elephant | Snake)[]。
  3. // 但是如果有animals 将得出 animals[] ,

类型兼容性

两种兼容性:子类型和赋值
不相关的有同种值的类也被看成相同类型, 传统语言则不同(c# java)
如果x要兼容y,那么y至少具有与x相同的属性。

函数类型相同: 参数类型相同且只能多参不能少参 + 返回值类型属于其字类型
不同枚举类型互不兼容
类的比较: 仅限于实例的成员

高级类型

交叉类型(Intersection Types)

这个类型的对象同时拥有了这三种类型的成员。

联合类型(Union Types)

与交叉类型相似,但是只能访问此联合类型的所有类型里共有的成员。
如果必须要访问,可以使用断言

类型保护与区分类型:

  1. 用户自定义类型保护:
  2. function isFish(pet: Fish | Bird): pet is Fish {
  3. return (<Fish>pet).swim !== undefined;
  4. }
  5. typeof 类型保护 => "number" "string" "boolean" "symbol"
  6. function isNumber(x: any): x is number {
  7. return typeof x === "number";
  8. }

instanceof的右侧要求是一个构造函数,TypeScript将细化为联合

类型保护和类型断言: 可以为null的类型是通过联合实现
类型别名
type NameResolver = () =>string; type NameOrResolver = Name | NameResolver;
可以在属性当中引用自己,但不能出现在声明中
type Container = { value: T };
type Yikes = Array; // error
extends和 implements(自己也不能 extends和 implements其它类型)
软件对扩展是开放的,对修改是封闭的

可辨识联合:

  1. type Shape = Square | Rectangle | Circle;
  2. function area(s: Shape) {
  3. switch (s.kind) {
  4. case "square": return s.size * s.size;
  5. case "rectangle": return s.height * s.width;
  6. case "circle": return Math.PI * s.radius ** 2;
  7. }
  8. }
  9. // 完整性检查: 没处理的可能值值

F-bounded多态性: 返回的值可继续调用别的方法

keyof 约等于 key1 | key2 ….

映射类型: 从原有的类型生成多种新的类型

  1. interface PersonPartial {
  2. name?: string;
  3. age?: number;
  4. }
  5. 或者我们想要一个只读版本:
  6. interface PersonReadonly {
  7. readonly name: string;
  8. readonly age: number;
  9. }
  10. 这在JavaScript里经常出现,TypeScript提供了从旧类型中创建新类型的一种方式 映射类型。 在映射类型里,新类型以相同的形式去转换旧类型里每个属性。 例如,你可以令每个属性成为 readonly类型或可选的。 下面是一些例子:
  11. type Readonly<T> = {
  12. readonly [P in keyof T]: T[P];
  13. }
  14. type Partial<T> = {
  15. [P in keyof T]?: T[P];
  16. }

预定义的有条件类型

  • Exclude — 从T中剔除可以赋值给U的类型。
  • Extract — 提取T中可以赋值给U的类型。
  • NonNullable — 从T中剔除null和undefined。
  • ReturnType — 获取函数返回值类型。
  • InstanceType — 获取构造函数类型的实例类型。


Symbols

基本类型: 生成变量唯一且不可变,可用作对象的keyz

迭代器和生成器

实现了Symbol.iterator属性时,我们认为它是可迭代的
for..in迭代的是对象的 的列表,而for..of则迭代对象的键对应的值。

模块

  1. export { ZipCodeValidator as mainValidator }; // 导出语句
  2. export {ZipCodeValidator as RegExpBasedZipCodeValidator} from "./ZipCodeValidator";//重新导出
  3. // 重新导出 =》 扩展模块
  4. 兼容CommonJSAMDexports
  5. export = ModuleName;
  6. import module = require("./Modulepath");

如果仅导出单个 class 或 function,使用 export default
如果要导出多个对象,把它们放在顶层里导出
import * as myLargeModule 去导入大量东西

命名空间

namespace {exxport module}
引入: import 或者 ///
对模块也可以使用///
declaremodule “SomeModule” { exportfunctionfn(): string; }

装饰器模式

属性装饰器:
target —— 对于静态成员来说是类的构造函数,对于实例成员是类的原型对象
propertyKey —— 属性的名称。
没有返回值。
方法装饰器:
target —— 对于静态成员来说是类的构造函数,对于实例成员是类的原型对象。
propertyKey —— 属性的名称。
descriptor —— 方法的属性描述符。
方法参数装饰器:、

访问器装饰器:

装饰器访问顺序:

  1. 参数装饰器,然后依次是方法装饰器,访问符装饰器,或属性装饰器应用到每个实例成员。
  2. 参数装饰器,然后依次是方法装饰器,访问符装饰器,或属性装饰器应用到每个静态成员。
  3. 参数装饰器应用到构造函数。
  4. 类装饰器应用到类。