let decLiteral: number = 6; let hexLiteral: number = 0xf00d; // ES6 中的二进制表示法 let binaryLiteral: number = 0b1010; // ES6 中的八进制表示法 let octalLiteral: number = 0o744; let notANumber: number = NaN; let infinityNumber: number = Infinity; //编译的结果 var decLiteral = 6; var hexLiteral = 0xf00d; // ES6 中的二进制表示法 var binaryLiteral = 10; // ES6 中的八进制表示法 var octalLiteral = 484; var notANumber = NaN; var infinityNumber = Infinity;
String
let myName: string = 'Tom';
Boolean
let isDone: boolean = false; // 编译通过 // 后面约定,未强调编译错误的代码片kk段,默认为编译通过
let createdByNewBoolean: boolean = new Boolean(1); // index.ts(1,5): error TS2322: Type 'Boolean' is not assignable to type 'boolean'. // 后面约定,注释中标出了编译报错的代码片段,表示编译未通过
Void
//JavaScript 没有空值(Void)的概念,在 TypeScript 中,可以用 void 表示没有任何返回值的函数: functionalertName(): void{ alert('My name is Tom'); } //能将它赋值为 undefined 和 null: let unusable: void = undefined; let unusable: void = null;
Null 和 Undefined
let u: undefined = undefined; let n: null = null; //与 void 的区别是,undefined 和 null 是所有类型的子类型。也就是说 undefined 类型的变量,可以赋值给 number 类型的变量: // 这样不会报错 let num: number = undefined; //而 void 类型的变量不能赋值给 number 类型的变量: let u: void; let num: number = u;
// index.ts(2,5): error TS2322: Type 'void' is not assignable to type 'number'.
Any
//任意值(Any)用来表示允许赋值为任意类型。 let myFavoriteNumber: any = 'seven'; myFavoriteNumber = 7;
// 定义一对值分别为 string 和 number 的元组: let x: [string, number]; // Initialize it x = ['hello', 10]; // OK // Initialize it incorrectly x = [10, 'hello']; // Error
onsole.log(x[0].substr(1)); // OK console.log(x[1].substr(1)); // Error, 'number' does not have 'substr'
enum Days {Sun = 7, Mon, Tue, Wed, Thu, Fri, Sat = <any>"S"}; //使用类型断言来让 tsc 无视类型检查
常数枚举
常数枚举是使用 const enum 定义的枚举类型:
constenum Directions { Up, Down, Left, Right }
let directions = [Directions.Up, Directions.Down, Directions.Left, Directions.Right]; //常数枚举与普通枚举的区别是,它会在编译阶段被删除,并且不能包含计算成员(赋值)。 //上例的编译结果是: var directions = [0/* Up */, 1/* Down */, 2/* Left */, 3/* Right */];
let timer:number|null = null timer = setTimeout(()=>{})
类型断言
//类型断言有两种形式。 其一是“尖括号”语法: let someValue: any = "this is a string"; let strLength: number = (<string>someValue).length; //另一个为as语法: let someValue: any = "this is a string"; let strLength: number = (someValue asstring).length; //两种形式是等价的。 至于使用哪个大多数情况下是凭个人喜好;然而,当你在TypeScript里使用JSX时,只有as语法断言是被允许的。
let tom: Person = { name: 'Tom', age: 25, gender: 'male' };
// index.ts(3,5): error TS2411: Property 'age' of type 'number' is not assignable to string index type 'string'. // index.ts(7,5): error TS2322: Type '{ [x: string]: string | number; name: string; age: number; gender: string; }' is not assignable to type 'Person'. //Index signatures are incompatible. //Type 'string | number' is not assignable to type 'string'. //Type 'number' is not assignable to type 'string'.
//上例中,任意属性的值允许是 string,但是可选属性 age 的值却是 number,number 不是 string 的子属性,所以报错了。
class Cat extends Animal { public eat() { console.log(`${this.name} is eating.`); } }
let a = new Animal('Jack'); // index.ts(9,11): error TS2511: Cannot create an instance of the abstract class 'Animal'
let cat = new Cat('Tom'); // index.ts(9,7): error TS2515: Non-abstract class 'Cat' does not implement inherited abstract member 'sayHi' from class 'Animal'.
let b: Boolean = newBoolean(1); let e: Error = newError('Error occurred'); let d: Date = newDate(); let r: RegExp = /[a-z]/;
DOM 和 BOM 的内置对象 Document、HTMLElement、Event、NodeList …..
let body: HTMLElement = document.body; let allDiv: NodeList = document.querySelectorAll('div'); document.addEventListener('click', function(e: MouseEvent) { // Do something });
TypeScript 核心库的定义文件
Math.pow(10, '2');
// index.ts(1,14): error TS2345: Argument of type 'string' is not assignable to parameter of type 'number'.
//事实上Math.pow 的类型定义如下: interface Math { /** * Returns the value of a base expression taken to a specified power. * @param x The base value of the expression. * @param y The exponent value of the expression. */ pow(x: number, y: number): number; }
type 类型别名
type 会给一个类型起个新名字。 type 有时和 interface 很像,但是可以作用于原始值(基本类型),联合类型,元组以及其它任何你需要手写的类型。
type Name = string; // 基本类型 type NameResolver = () =>string; // 函数 type NameOrResolver = Name | NameResolver; // 联合类型 functiongetName(n: NameOrResolver): Name{ if (typeof n === 'string') { return n; } else { return n(); } } //类型别名常用于联合类型。
注意:别名可以是任意的合法字符串,一般首字母大写
type 和 interface的区别
type类型别名,可以定义基础类型,元组等
type不可以继承
type不会创建一个真正的新的类名
类型别名无法被实现implements,而接口可以被派生类实现
类型别名重名会抛出错误,接口重名是会产生合并
字符串字面量类型
字符串字面量类型用来约束取值只能是某几个字符串中的一个。
type EventNames = 'click' | 'scroll' | 'mousemove'; functionhandleEvent(ele: Element, event: EventNames) { // do something }