枚举
异构枚举: 成员值类型不同
联合枚举与枚举成员的类型:枚举值可以成为类型
反向枚举: a = Enum.A; value = Enum[a] 枚举对象值为KEY,KEY为值
常量枚举: 加个 const, 不允许计算成员,且在编译阶段删除
外部枚举 描述已经存在的枚举类型的形状。
类型推论
最佳通用类型
let zoo = [new Rhino(), new Elephant(), new Snake()];// 根据三个元素综合得出 (Rhino | Elephant | Snake)[]。// 但是如果有animals 将得出 animals[] ,
类型兼容性
两种兼容性:子类型和赋值
不相关的有同种值的类也被看成相同类型, 传统语言则不同(c# java)
如果x要兼容y,那么y至少具有与x相同的属性。
函数类型相同: 参数类型相同且只能多参不能少参 + 返回值类型属于其字类型
不同枚举类型互不兼容
类的比较: 仅限于实例的成员
高级类型
交叉类型(Intersection Types)
联合类型(Union Types)
与交叉类型相似,但是只能访问此联合类型的所有类型里共有的成员。
如果必须要访问,可以使用断言
类型保护与区分类型:
用户自定义类型保护:function isFish(pet: Fish | Bird): pet is Fish {return (<Fish>pet).swim !== undefined;}typeof 类型保护 => "number", "string", "boolean"或 "symbol"。function isNumber(x: any): x is number {return typeof x === "number";}
instanceof的右侧要求是一个构造函数,TypeScript将细化为联合
类型保护和类型断言: 可以为null的类型是通过联合实现
类型别名
type NameResolver = () =>string; type NameOrResolver = Name | NameResolver;
可以在属性当中引用自己,但不能出现在声明中
type Container
type Yikes = Array
extends和 implements(自己也不能 extends和 implements其它类型)
软件对扩展是开放的,对修改是封闭的
可辨识联合:
type Shape = Square | Rectangle | Circle;function area(s: Shape) {switch (s.kind) {case "square": return s.size * s.size;case "rectangle": return s.height * s.width;case "circle": return Math.PI * s.radius ** 2;}}// 完整性检查: 没处理的可能值值
F-bounded多态性: 返回的值可继续调用别的方法
keyof 约等于 key1 | key2 ….
映射类型: 从原有的类型生成多种新的类型
interface PersonPartial {name?: string;age?: number;}或者我们想要一个只读版本:interface PersonReadonly {readonly name: string;readonly age: number;}这在JavaScript里经常出现,TypeScript提供了从旧类型中创建新类型的一种方式 — 映射类型。 在映射类型里,新类型以相同的形式去转换旧类型里每个属性。 例如,你可以令每个属性成为 readonly类型或可选的。 下面是一些例子:type Readonly<T> = {readonly [P in keyof T]: T[P];}type Partial<T> = {[P in keyof T]?: T[P];}
预定义的有条件类型
- Exclude
— 从T中剔除可以赋值给U的类型。 - Extract
— 提取T中可以赋值给U的类型。 - NonNullable
— 从T中剔除null和undefined。 - ReturnType
— 获取函数返回值类型。 - InstanceType
— 获取构造函数类型的实例类型。
Symbols
基本类型: 生成变量唯一且不可变,可用作对象的keyz
迭代器和生成器
实现了Symbol.iterator属性时,我们认为它是可迭代的
for..in迭代的是对象的 键 的列表,而for..of则迭代对象的键对应的值。
模块
export { ZipCodeValidator as mainValidator }; // 导出语句export {ZipCodeValidator as RegExpBasedZipCodeValidator} from "./ZipCodeValidator";//重新导出// 重新导出 =》 扩展模块兼容CommonJS和AMD的exports:export = ModuleName;import module = require("./Modulepath");
如果仅导出单个 class 或 function,使用 export default
如果要导出多个对象,把它们放在顶层里导出
import * as myLargeModule 去导入大量东西
命名空间
namespace {exxport module}
引入: import 或者 ///
对模块也可以使用///
declaremodule “SomeModule” { exportfunctionfn(): string; }
装饰器模式
属性装饰器:
target —— 对于静态成员来说是类的构造函数,对于实例成员是类的原型对象
propertyKey —— 属性的名称。
没有返回值。
方法装饰器:
target —— 对于静态成员来说是类的构造函数,对于实例成员是类的原型对象。
propertyKey —— 属性的名称。
descriptor —— 方法的属性描述符。
方法参数装饰器:、
访问器装饰器:
装饰器访问顺序:
- 参数装饰器,然后依次是方法装饰器,访问符装饰器,或属性装饰器应用到每个实例成员。
- 参数装饰器,然后依次是方法装饰器,访问符装饰器,或属性装饰器应用到每个静态成员。
- 参数装饰器应用到构造函数。
- 类装饰器应用到类。
