1.变量(基础类型和定义)
typescript定义变量需要指定变量的类型,后面不许更改变量的类型
1>定义
let 和 var 和const的区别
let定义的变量只在作用域中起作用,出来作用域就会被销毁
var在指定作用域中起作用
比如:都在函数中定义for循环,let只能在for循环中使用,var可以在整个函数中使用
const 定义的变量不可以修改值,是一个常量
2>基础类型
//Boolean
let isDone: boolean = false;
//number
let decLiteral: number = 6;
//string
let name: string = "bob";
//对象Object
let info:Object = {};
//数组Array<元素类型>或number[]
let list: Array<number> = [1, 2, 3];
let list: number[] = [1, 2, 3];
//元组---个数类型,位置都确定
let x: [string, number];
x = ['hello', 10]; // OK
x = [10, 'hello']; // Error
//枚举enum
//不给赋值的话一般从0开始,赋值了,之后的元素对应值,接在后面递增
//把枚举的名字变成值
enum Color {Red = 1, Green, Blue}
let c: Color = Color.Green;//2
//由枚举的值得到它的名字
enum Color {Red = 1, Green, Blue}
let colorName: string = Color[2];
//Any
let notSure: any = 4;
let tts:Array<any> = [1,"2",new Date()];
//函数
//规定返回值类型为number
function run1():number{
return 1;
}
//没有返回值,
function run3(name:string,age?:number):void{
//age这个参数可传可不传
}
//function run():never{}一般是死循环等永远拿不到的值
//类型断言
let someValue: any = "this is a string";
//尖括号”语法:
let strLength: number = (<string>someValue).length;
//as语法
let strLength: number = (someValue as string).length;
//高级类型
//|交叉类型,可以是str也可以是num
function test2():string|number{
return 123;
}
//&联合类型
2.类
1>类的创建
class Person{
name:string;
constructor(){
this.name = "xiaoming";
}
open(){
console.log("Person.open()");
}
}
//es5
function Person(){
this.name = "xiaoming";
this.open = function(){
console.log("Person.open()");
}
}
2>公共,私有与受保护的修饰符
a)public默认,公开,可以在继承了父类的子类内部使用,外部也可以访问
b)protected是只要自己和子类的内部就可以访问,外部不可访问
c)private私有的,只有自己才能访问,子类内部都不可以访问
一般通过存储器来设置,使用某些私有属性
//protected
class Chinese{
constructor(){}
protected action(type:number){
let deng ="red";
let actionType = "Stop";
switch (type){
case 0:
break;
case 1:
deng = "green";
actionType = "go";
break;
case 2:
deng = "yellow";
actionType = "go";
break;
default :
deng = "black";
actionType = "go";
break;
}
console.log("灯的颜色是"+deng+"意思是 "+actionType);
}
red(){this.action(0);}
green(){this.action(1);}
yellow(){this.action(2);}
}
//假如西安比其他地方多一个黑的等
class Xian extends Chinese{
static CityName = "xian";//静态属性,和类属性差不多
constructor(){super();}
black(){
this.action(3)
}
}
//private
class Person{
private name:string = "";
protected age:number = 8;
/*
//es5set,get方法
var _name = "";
this.getName = function(){
return _name
}
this.setName = function(){
_name = name;
}*/
get getName(){
if(this.age>30){}
return this.name;
}
set setName(name:string){
this.name = name;
}
}
class China extends Person{
constructor(){
super();
}
move(){
// console.log(this.age+this.name);//protect类可以在子类里使用,所以this.age可以,name不行
console.log("年龄是"+this.age+this.getName);//存储器直接当做属性一样使用
}
}
3.继承
class Animal{
blood:number;
att:number;
level:number;
constructor(blood:number,att:number,level:number){
this.blood = blood;
this.att = att;
this.level = level;
}
}
class Person extends Animal{
name:string;
job:string; constructor(blood:number,att:number,level:number,name:string,job:string){
super(blood,att,level);
this.name = name;
this.job = job;
}
}
//es5
//多重继承
//混合继承
4.命名空间和模块
注意:不应该对模块使用命名空间
使用命名空间是为了提供逻辑分组和避免命名冲突。 模块文件本身已经是一个逻辑分组,并且它的名字是由导入这个模块的代码指定,所以没有必要为导出的对象增加额外的模块层。
module flower{
//导出flower模块中的Rose类
export class Rose{
constructor(){}
open(){
console.log("a beautify Rose");
}
}
}
//在其他文件中使用Rose的open方法
new flower.Rose().open();
//命名空间
namespace hxx{
//导出命名空间里的内容
export let name ="hxx";
}
//使用
console.log(hxx.name);
5.基础类
基础类不可实例化,只有继承了基础类的子类可以实例化(BMap的时候见了些)
abstract class DBManagerBase{
private dbName:"ST"
constructor(){}
opration(){
console.log("opration");
}
}
class DBManager extends DBManagerBase{
constructor(){
super();
}
}
new DBManager().opration();
new DBManagerBase();//Error,基础类不可实例化,只有继承了基础类的子类可以实例化