//布尔值
let isDone: boolean = false;
//数字
let decLiteral: number = 6;
let hexLiteral: number = 0xf00d;
let binaryLiteral: number = 0b1010;
let octalLiteral: number = 0o744;
//字符串
let name: string = “Gene”;
let sentence: string = `Hello, my name is ${ name }.`;
//数组
let list: number[] = [1, 2, 3]; //由number类型元素组成的数组
let list: Array<number> = [1, 2, 3]; //数组泛型方式:Array<元素类型>
//元组Tuple《表示一个已知元素数量和类型(不同)的数组》
let x: [string, number]; // Declare a tuple type
x = ['hello', 10]; // Initialize it, OK
x = [10, 'hello']; // Initialize it incorrectly, Error
/* 当访问一个越界的元素,会使用联合类型替代:*/
x[3] = 'world'; // OK, 字符串可以赋值给(string | number)类型
console.log(x[5].toString()); // OK, 'string' 和 'number' 都有 toString
x[6] = true; // Error, 布尔不是(string | number)类型
//联合类型(通过管道(|)将变量设置多种类型)
var val:string|number
val = 12
console.log("数字为 "+ val)
val = "Runoob"
console.log("字符串为 " + val)
//枚举
enum Color {Red = 1, Green, Blue}
let c: Color = Color.Green;
let colorName: string = Color[2];
console.log(colorName); // 可由枚举的值2得到它的名字'Green'
//Any(为不清楚类型的变量所指定的类型)
let notSure: any = 4;
notSure = "maybe a string instead";
notSure = false; // okay, definitely a boolean
let list: any[] = [1, true, "free"];
list[1] = 100;
//Void(没有任何类型)
let unusable: void = undefined;
//Null 和 Undefined
let u: undefined = undefined;
let n: null = null;
//Never(表示永不存在的值类型)
/* 返回never的函数必须存在无法达到的终点 */
function error(message: string): never {
throw new Error(message);
}
function infiniteLoop(): never {
while (true) {
}
}
//Object(非原始类型)
declare function create(o: object | null): void;
create({ prop: 0 }); // OK
create(null); // OK
create(42); // Error
create("string"); // Error
create(false); // Error
create(undefined); // Error
//类型断言
/* 尖括号语法形式: */
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 as string).length;
function buildName(firstName: string, lastName?: string) {
...
}
function calculate_discount(price:number,rate:number = 0.50) {
...
}
function buildName(firstName: string, ...restOfName: string[]) {
...
}
接口是一系列抽象方法的声明,是一些方法特征的集合,这些方法都应该是抽象的,需要由具体的类去实现。
interface LabelledValue {
label: string;
color?: string; //可选属性
readonly x: number; //只读属性
[propName: string]: any; //索引签名
}
function printLabel(labelledObj: LabelledValue) {
console.log(labelledObj.label);
}
let myObj = {size: 10, label: "Size 10 Object"};
printLabel(myObj);
interface SearchFunc {
(source: string, subString: string): boolean;
}
let mySearch: SearchFunc;
mySearch = function(source: string, subString: string) {
let result = source.search(subString);
return result > -1;
}
接口继承是指接口可以通过其他接口来扩展自己。
单接口继承语法格式:
Child_interface_name extends super_interface_name
多接口继承语法格式:
Child_interface_name extends super_interface1_name, super_interface2_name,…,super_interfaceN_name
继承实例
//单接口继承
interface Person {
age:number
}
interface Musician extends Person {
instrument:string
}
var drummer = <Musician>{};
drummer.age = 27
drummer.instrument = "Drums"
console.log("年龄: "+drummer.age)
console.log("喜欢的乐器: "+drummer.instrument)
//多接口继承
interface IParent1 {
v1:number
}
interface IParent2 {
v2:number
}
interface Child extends IParent1, IParent2 { }
var Iobj:Child = { v1:12, v2:23}
console.log("value 1: "+Iobj.v1+" value 2: "+Iobj.v2)
类的数据成员包括:字段、构造函数、方法。
class Car {
// 字段
engine:string;
// 构造函数
constructor(engine:string) {
this.engine = engine
}
// 方法
disp():void {
console.log("函数中显示发动机型号 : "+this.engine)
}
}
// 创建一个对象
var obj = new Car("XXSY1")
// 访问字段
console.log("读取发动机型号 : "+obj.engine)
// 访问方法
obj.disp()
class Shape {
Area:number
constructor(a:number) {
this.Area = a
}
}
class Circle extends Shape {
disp():void {
console.log("圆的面积: "+this.Area)
}
}
var obj = new Circle(223);
obj.disp()
implements
,并将接口字段作为类的属性使用。interface ILoan {
interest:number
}
class AgriLoan implements ILoan {
interest:number
rebate:number
constructor(interest:number,rebate:number) {
this.interest = interest
this.rebate = rebate
}
}
var obj = new AgriLoan(10,1)
console.log("利润为 : "+obj.interest+",抽成为 : "+obj.rebate )
命名空间使用namespace来定义。
namespace SomeNameSpaceName {
export interface ISomeInterfaceName { }
export class SomeClassName { }
}
//在另一个命名空间的调用语法格式
SomeNameSpaceName.SomeClassName;
//命名空间在单独的typescript文件中使用三斜杠///引用
///
命名空间支持嵌套,即可以将命名空间定义在另外一个命名空间里头。
成员的访问使用.号来实现。
//Invoice.ts 文件代码:
namespace Runoob {
export namespace invoiceApp {
export class Invoice {
public calculateDiscount(price: number) {
return price * .40;
}
}
}
}
//InvoiceTest.ts 文件代码:
///
var invoice = new Runoob.invoiceApp.Invoice();
console.log(invoice.calculateDiscount(500));
模块导出使用关键字export,语法格式为:
// 文件名 : SomeInterface.ts
export interface SomeInterface {
// 代码部分
}
在另一个文件使用该模块需要使用import关键字来导入:
import someInterfaceRef = require("./SomeInterface");
声明文件为一个描述js库和模块信息的文件,以.d.ts为后缀,通过引用声明文件,可以借用ts的各种特性来使用库文件。
declare module Module_Name {
}
//引入声明文件
///
//CalcThirdPartyJsLib.js 文件代码:
var Runoob;
(function(Runoob) {
var Calc = (function () {
function Calc() {
}
})
Calc.prototype.doSum = function (limit) {
var sum = 0;
for (var i = 0; i <= limit; i++) {
sum = sum + i;
}
return sum;
}
Runoob.Calc = Calc;
return Calc;
})(Runoob || (Runoob = {}));
var test = new Runoob.Calc();
//对应声明文件 Calc.d.ts代码:
declare module Runoob {
export class Calc {
doSum(limit:number) : number;
}
}
//ps: 声明文件不包含实现,它只是类型声明
//CalcTest.ts 文件代码:
///
var obj = new Runoob.Calc();
// obj.doSum("Hello"); // 编译错误
console.log(obj.doSum(10));