一、类型断言的用途
1.将一个联合类型断言为其中一个类型
注:联合类型可以断言为其中类型,父类可以断言为子类,任何类型可以断言为any类型,any类型可以断言为任意类型。
interface Cat{
name:string;
run():void;
}
interface Fish{
name:string;
swim():void
}
function isFish(animal:Cat|Fish){
//if(animal.swim){这样会报错,因为没有判断它的类型
if((animal as Fish).swim){//为了欺骗编译器,告诉它有类型的
return true
}else{
return false
}
}
二、类型别名
type lString=string;
let username:lString="小米"
username=123;//error
type lStringNumber=string|number
let user1: lStringNumber=123//right
user1="123"//right
//约束字符串的取值,约束事件绑定
type Eventname="click"|"scroll"|"mousemove";
let eventStr:Eventname="cli";//error
let eventStr:Eventname1="click";//right
三、枚举类型
enum Days{sun,mon.tue,wed,thu,fri,sat};
console.log(Days["sum"])
console.log(Days[0])
注:
第一次在tsc enum.ts
编译后,执行node enum.js
结果:
//undefined
//sun
第二次在tsc enum.ts
编译后,执行node enum.js
//0
//sun
enum Days{sun,mon.tue,wed,thu,fri,sat};
let day:Days=Days.sun;
let days:Days[]=[Days.sun,Days.mon];
四、类class
封装、继承、多态、存取器、抽象类、接口
public、private、protected
class Animal{
public name;
public constructor(name){
this.name=name
}
}
let a= new Animal('Jack')
console.log(a.name)//Jack
a.name="Tom"
console.log(a.name)//Tom
class Animal{
private name;
public constructor(name){
this.name=name
}
public sayname(){
return this.name;
}
}
let a= new Animal('Jack')
console.log(a.name)//error
a.name="Tom"
console.log(a.name)//error
console.log(a.sayname())//right
public 可以在内外部可用
private 只能内部使用
protected 允许子类访问使用
五、参数属性与只读
readonly
class Animal2{
public constructor(public name){
}
}
//相等于
class Animal1{
public name;
public constructor(name){
this.name=name
}
}
class Animal3{
public name;
public readonly color:string;//只读属性
public constructor(name){
this.name=name
}
}
let a1=Animal3('小米','蓝色')
a1.color='红色'//error
六、抽象类
abstract class Animal4{
public name;
public constructor(name){
this.name=name
}
abstract public sayhi(){
return this.name;
}
}
class Cat4 extends Animal4{
sayhi(){
console.log('cat4')
}
}
let cat4:Cat4=new Cat4();//right
let cat4:Animal4=new Cat4();//right
七、类与接口
类与接口放在一起
//门-》类-》防盗门-》防盗门会响铃
interface Alarm{
alert():void
}
abstract class Door{
public abstract open();
}
class SecerityDoor extends Door implements Alarm{//继承接口
open(){
console.log('打开门')
}
alert(){
console.log('响铃')
}
}
八、泛型
//基本写法
function creatArray(length:number,value:any):Array<any>{
let result=[];
for(let i=0;i<length;i++){
result[i]=value;
}
return result;
}
//泛型写法
function creatArray<T,U>(length:number,value:T,value2:U):Array<T|U>{
let result:T[]=[];
for(let i=0;i<length;i++){
result[i]=value;
}
return result;
}
interface CreateArrayFn{
<T>(length:number,value:T):Array<T>;
}
let CreateArray2: CreateArrayFn=function<T,U>(length:number,value:T,value2:U):Array<T>{
let result:T[]=[];
for(let i=0;i<length;i++){
result[i]=value;
}
return result;
}
class GenericNumber<T>{
zeroValue:T;
add(x:T,y:T):number{
console.log(x)
return 0
}
}
let nemberObj=new GenericNumber<number>()
numberObj.add(10,10)
numberObj.add(10,'1')//error,因为在new的时候已经将归类为number类型了。