交叉类型
同时满足两种类型(几种类型之和) (&)
function extend<T extends Object, U extends Object>(source: T,target: U): T & U {let result = {} as T & U;for (let key in source) {result[key] = source[key] as any;}for (let key in target) {if (!result.hasOwnProperty(key)) {result[key] = target[key] as any;}}return result;}
class Person {name: string;constructor(name: string) {this.name = name;}}interface Logable {log(): void;}class Log implements Logable {log() {console.log('log');}}const test = extend(new Person('james'), new Log());// test 满足Person,Log两种类型test.name = 'curry';test.log();
联合类型
几种类型之一 (|)
function test(value: string | string): number {if (typeof value === 'number') {return value;}if (typeof value === 'string') {return parseFloat(value);}return 0;}class Dog {name: string;constructor(name: string) {this.name = name;}run() {}}class Fish {name: string;constructor(name: string) {this.name = name;}swim() {}}function getPet(name: string, isDog: boolean): Dog | Fish {if (isDog) {return new Dog(name);} else {return new Fish(name);}}
类型保护
方法一: is XXX
// error:类型“Dog | Fish”上不存在属性“run”。// dog.run()// 如何确定具体是什么类型:类型保护function isDog(pet: Fish | Dog): pet is Dog {return (pet as Dog).run !== undefined;}if (isDog(pet)) {pet.run();} else {pet.swim();}
方法二:使用 typeof、instanceof 进行类型保护
if (pet instanceof Dog) {pet.run();}
null
tsc xxx.ts —strictNull (如果空值,会提示报错)
class C {a: number;b?: number;constructor(a: number, b?: number) {this.a = a;this.b = b;}}const c = new C(1, 2);c.a = 20;// 不能将类型“null”分配给类型“number | undefined”。// c.b = null
变量后加 !:表示变量一定不为 null
变量后加 ?:表示变量可能为空,编译时加了判断
function broken(name: string | null) {function getFirstChar() {// return name?.charAt(0)return name!.charAt(0);}name = name || 'default';return getFirstChar();}
// 编译结果function broken(name) {function getFirstChar() {// void 0 (相当于 undefined)return name === null || name === void 0 ? void 0 : name.charAt(0);}name = name || 'default';return getFirstChar();}
undefined
let a: string = 'str';// error:不能将类型“undefined”分配给类型“string”a = undefined;
字符串字面量
例如这种情况,ease 只能是:'easi-in'|'ease-out'|'ease-in-out'
type Easing = 'ease-in' | 'ease-out' | 'ease-in-out';
class UIElement {
animate(dx: number, dy: number, easing: Easing) {
if (easing === 'ease-in') {
} else if (easing === 'ease-out') {
} else if (easing === 'ease-in-out') {
}
}
}
