ts基础

80 阅读6分钟

安装

全局安装

npm install -g typescript

查看版本号:

tsc -V

typescript基础类型

具体的类型代码和测试如下

//布尔值----1 
let b:boolean=false;
console.log("布尔值::",b);//false

//数字类型有四种表达方式,2进制  8进制 10 进制 16进制  以20为列----2
let erJinZhi=0b10100;
console.log("二进制::",erJinZhi);//20
//八进制,8的2倍加上4
let baJinZhi=0O24;
console.log("八进制::",baJinZhi);//20
//十进制  10的2倍加上0
let shiJinZhi=20;
console.log("十进制::",shiJinZhi);//20
//十六进制 16加上4
let shiLiuJinZhi=0X14;
console.log("十六进制::",shiJinZhi);//20


//字符串----3
let s:string="hahah";
console.log(s);

//数组,数组有两种表示方法----4
let arr:number[]=[1,2,3,4];
let arr2:Array<number>=[5,6,7,8];
console.log(arr);
console.log(arr2);

//元组, 元组就是在  固定长度,固定类型-----5
let yuanZu:[string,number];
yuanZu=["ni",1];
console.log(yuanZu);

//枚举类型,枚举类型默认是有下标的-----6
enum Color{
    red,
    green=2,//枚举类型的下表是可以进行修改的
    blue
}
let a:string=Color[0];
console.log(a);
console.log(Color.blue);//可以直接输出输出的是下标


//any类型 可以允许是任何类型--------7
let aa:any="sssss";
console.log(aa);//sssss


//void类型 就是空类型  只允许赋值 undefined类型和null类型-----8
let v:void=undefined;//可以的
let v1:void=null;//可以的,除了这两个其他都会报错,所以毫无意义




//undefined和null 是所有类型的子类型-------9
let n:number=5;
n=null;//子类型可以赋值给父类型
n=undefined;//子类型可以赋值给父类型
let n1:number=null; //null是自雷所以是可以的




//never类型 表示不存在的类型,一般用于函数 返回值-----10
function fn():never{//抛出异常信息
    throw new Error("something fail ");
}
function fn1():never{//永远都在循环
    while(true){}
}

强制类型转换

any类型强制类型转换成其他的类型:

//any类型强制转换成 其他类型
let ss1:any=11111111; 
let ss0:string=(<string>ss1);//第一种方式
let ss2:string=(ss1 as string);//第二种方式

接口

接口的定义方式:

//接口的定义方式
interface Person{//接口是可以作为一个类型的
    name:string;
}

function fn(arg:Person){//接口可以作为类型
    console.log(arg);
}
fn({name:"张三"});//则必须是与接口对应起来的才可以

接口的可选属性

就是这个属性可以填写,也可以不填写。

//接口的可选属性
interface A{
    name?:string;
    age?:number;
}

function person (arg:A){

}
//虽然规定了类型是A接口,但是里边的属性是可选属性,可以填写也可以不填写
person({name:"张安"});

只读属性

只读属性:readonly

只读数组的属性

只读数组的报错:

所以报错是因为只能读不能修改,所以报错。

接口函数类型

则接口函数类型的变量的值必须是一个函数。

正确的函数接口类型代码如下:

//函数接口类型
interface FunType{
    (n:number,s:string):boolean //且函数的参数必须是固定的类型,返回值也是
}
let fn:FunType;
// fn=5;//报错,必须是一个函数
fn=function(nu:number,ss:string):boolean{
    return nu>-1;
}

可索引属性

这个是最简单的可索引属性:

//可索引属性
interface Person{
    [index:number]:string
}
let person:Person=["张三","李四","王五"];//那么就只能够按照这个模式来写数组,索引和返回值的类型固定了
console.log(person[0]);

索引签名还支持字符串签名。其实签名方式就只有两种,一个是number,一个是string。

可以单独使用字符串签名吗?

可以的。

如下代码:

//可以单独使用字符串签名吗
interface Person{
    [x:string]:string
}
let person:Person={"name":"张三","name2":"李四"};
console.log(person.name);

字符串和数字共同签名:

数字类型的返回值,必须是字符串类型返回值的子类型。

数字类型返回子类型。字符串类型返回父类型。

原因是:数字类型其实也是以字符串的签名返回的,既然两个都是字符串的方式返回,那么返回的类型也应该保持一致,所以一个返回父,一个返回孩子。数字返回的是孩子,字符串返回的是父亲。

只读数字索引

好处是这个索引以后是不能够进行赋值更改的,起到了保护的作用。

如下代码:

//只读数字索引
interface readOnlyArrayIndex{
    readonly [index:number]:string;
}

实例接口和接口实现

ts中接口的实现有两种,一种是constructor实现,一种是实例new的实现。

如下说明,下边很多的代码,可以看看:

/**
 * 接口 实例接口  类  内容比较多
 * 
 */
//第一个:普通接口
interface Person{
    
    name:string;
    
    //有跑的方法
    run();
}
//类可以实现普通接口,就要实现里边的方法和属性
class Man implements Person{
    //实现父接口的name属性
    name:string;
    //自定义自己的属性
    tall:number;
    run(){
        console.log("run...");
    }
    //构造函数才可以构造出对象
    constructor(name:string,tall:number){
        this.name=name;
        this.tall=tall;
    }

    //具体自己的方法eat
    eat(){
        console.log("eat...");
    }

}
//使用这个实例,子类可以赋值给比自己大的类的变量的,但是只具备更大类的特性
let person:Person=new Man("王五",190);
console.log(person.name);//王五
person.run();//run...


//第二个:实例接口,是用来创建实例的。它的实例返回值就是它能接收的类。这样可以实例这个接收的类。
interface WoMan{
    //new 的时候参数和返回值
    new(name:string):Person;
}
function create(woman:WoMan,name:string):Person{
    return new woman(name);
}

class Boy implements Person{
    name:string;
    run(){};
}
let boy:Person=create(Boy,"李四");
console.log(boy.name);

接口的继承

接口是可以被多个接口继承的。

例如:

iterface1 extends interface2,interface3...

混合类型

混合类型就是在接口里边定义各种类型的规则。

//混合类型
interface MixinType{
    //必须是一个函数,且返回值是string
    (start:number):string;
    //有属性i
    i:number;
    //有一个方法,方法的返回值是空
    reset():void;
}

//把一个函数强制转换成混合类型,然后按照混合类型的特性添加相应的值。
let m:MixinType=(function(s:number){
}) as MixinType;
m.reset=function(){}
m.i=100;


console.log(m);

接口继承类

接口是可以继承类的。

//接口继承类
class Person{
    state:number;
}
interface Man extends Person{
    select();
}
//因为接口Man继承了,Person,所以也会继承Person的属性stat。后续实现接口的类也要是实现这个属性
class Boy implements Man{
    state=100;//必须实现,否则报错
    select(){//必须实现
        console.log("select of function...");
    }
}

类访问修饰符

private只能在类里边进行访问

protected子类可以用父类的内容

存取器

其实就是java里边的get方法和set方法。

type类型

是定义某个某个类型或者是某个值只能是哪些。

type t="a"|"b"...

t只能是 a 或者 b等。也可以是类型。 t=number|string... 只能属于某一些类型。