TypeScript的初学习(3)
9.类型兼容性(没看懂)
基于结构子类型的。结构类型是一种只是用其成员来描述类型的方式。
关于可靠性的注意事项
TypeScript的类型系统允许某些在编译阶段无法确认其安全性的操作。
规则:A需要兼容B,则B至少具有与A相同的属性。
比较两个函数:
let x = (a: number) => 0; let y = (b: number, s: string) => 0; //只需要比较对应类型的参数。 y = x; // OK x = y; // Error
函数参数双向协变
10. 高级类型
交叉类型
将多个类型合并成一个类型。使用场景:大多数在混入或不适合典型面向对象模型的地方
混合类型
一个参数的类型是 类型A或者类型B或者类型C
类型保护与区分类型
用户自定义的类型保护
function isFish(pet: Fish | Bird): pet is Fish { return (<Fish>pet).swim !== undefined; }
typeof类型保护
instanceof类型保护
类型别名
1 type Name = string;
2 type NameResolver = () => string;
3 type NameOrResolver = Name | NameResolver;
type Container<T> = { value: T };
4 function getName(n: NameOrResolver): Name {
5 if (typeof n === 'string') {
6 return n;
7 }
8 else {
9 return n();
10 }
11 }
字符串字面量类型
允许你指定字符串必须的固定值。
type Easing = "ease-in" | "ease-out" | "ease-in-out";
数字字面量类型
type num=1|2|3|4
枚举成员类型
当每个枚举成员都是用字面量初始化的时候枚举成员是具有类型的。
多态的this类型
多态的 this
类型表示的是某个包含类或接口的 子类型 。通过this,连贯性地继承类的值
索引类型
function pluck<T, K extends keyof T>(o: T, names: K[]): T[K][] { return names.map(n => o[n]); } interface Person { name: string; age: number; } let person: Person = { name: 'Jarid', age: 35 }; let strings: string[] = pluck(person, ['name']); // ok, string[] let personProps: keyof Person; // 'name' | 'age' //keyof T 索引类型查询操作符 用于获取某种类型的所有键,其返回类型是联合类型 //T[K]索引访问操作符
映射类型
从旧类型中创建新类型的一种方式。
11.Symbols
不可改变且唯一的。
可用作对象属性的键、与计算出的属性名声明结合来声明对象的属性和类成员。
12.迭代器和生成器
可迭代性:用for...of会遍历可迭代的对象。
for...of遍历则返回对象键对应的值,for....in则返回对象键的列表。而且for...in可以操作任何对象。
为各种不同的数据结构提供统一的访问机制,任何数据结构只要部署Iterator接口,就可以完成遍历操作。
13.模块
module:import或export声明
1.导出声明:任何声明(比如变量、类、类型别名或者接口)都能通过export关键字来导出。
2.导入:将整个模块导入到一个变量,并通过它来访问模块的到处部分。
import * as validator from "./ZipCodeValidator"; let myValidator = new validator.ZipCodeValidator();
3.export = 和import = require()
CommonJS和AMD的环境里都有一个exports
变量,这个变量包含了一个模块的所有导出内容。
为了支持CommonJS和AMD的exports
, TypeScript提供了export =
语法。export =
语法定义一个模块的导出对象
。 这里的对象
一词指的是类,接口,命名空间,函数或枚举。
使用export = 导出一个模块,则必须使用 import module = require("module")
来导入此模块。
export = ZipCodeValidator;
import zip = require("./ZipCodeValidator");
4.生成模块代码
5.模块中不要使用命名空间