本文已参与「新人创作礼」活动,一起开启掘金创作之路。
Ts类型
- 布尔:boolean
- 数字:number
- 字符串:string
- 枚举:enmu
- 数组:Array< string > == string[]
元组(Tuple)
明确个数和类型的数组
const state:[number,string] = [100,'nihao']
其他类型
symbol、null、undefinded 、any
unkonw
所有类型能分配给unkonw,unkonw只能赋值给unkonw和any
any既能接受所有类型也能赋值给所有类型
never
用户无法到达的类型
例如 抛出异常或者不会有返回值的函数
引用:never 和 void 的区别 void 可以被赋值为 null 和 undefined 的类型。 never 则是一个不包含值的类型。 拥有 void 返回值类型的函数能正常运行。拥有 never 返回值类型的函数无法正常返回,无法终止,或会抛出异常
bigInt 大数类型
number和bigInt不兼容
const max1 = Number.MAX_SAFE_INTEGER; // 2**53-1
console.log(max1 + 1 === max1 + 2); //true
const max2 = BigInt(Number.MAX_SAFE_INTEGER);
console.log(max2 + 1n === max2 + 2n); //false
let foo: number; let bar: bigint; foo = bar; //error
bar = foo; //error
object、Object 和 {}
object
非原始类型
Object
代表所有拥有hasProperty和toString的类型
{}
和Object一样
//number 和Number
let num:number = 1;
let numN:Number = 1;
num = numN; //error
numN = num; //right
let obj:object;
obj = number;//error
obj = numN;//right
obj = {}
let Obj:Object;
Obj = {}
Obj = num;
Obj = numN;
Obj = obj
Obj = {}
//{}等同于Object
let Object:{}
类型推论
定义时赋值就能推断是什么类型
let a;//推论any
let b = 1;//推论number
......
联合类型
联合类型表示取值为多种类型中的一种,未赋值时只能访问多种类型的共有的属性和方法。
||
let a :number||string
类型断言
手动告诉ts按照断言声明的类型来通过编译
//第一种(尖括号可能和as)
let someValue = 'this is string';
let length = (<string>songValue).length;
//第二种
let length = (songValue as string).length;
非空断言
断言操作对象是非null和undefinded的
字面量类型
Ts支持3种字面量类型 字符串字面量类型、数字字面量类型,布尔字面量类型
let flag: 'hello' = 'hello'
let flag: 1 = 1;
let flag: false = false
类型别名
用来给一个类型起一个别名
type Flag = number ||string
let a:Flag;
交叉类型
将多个类型合成一个类型使用&运算符
type Flag = number||string
type Flag1 = Flag&boolean
类型保护
编译时通过类型检测来确保某个作用域内的变量类型
typeof 类型保护
if(typeof input ==='string' ){
}
if(typeof input === 'number')
in关键字
interface Ivalue{
name:string
}
interface IName{
age:string
}
function(value:Ivalue|IName){
if('name' in value){
}
}
instanceof 同上
自定义类型保护
函数
指定返回值和参数的类型
函数定义
function fn(a:number,b:string):void{
}
函数表达式
//定义函数类型
type Fnc = (x:number,y:number)=>number
let fn:Fnc = function(a,b){}
可选参数
Ts中形参和实参要一致,不一致需要配置可选参数
?
function fn(name:string,age?:number)
默认参数
不传入实参则为默认的参数
function fn(url:string,data:{},type:string='GET'){
}
fn('/login',{})//默认参数type = 'GET'
剩余参数
剩余参数必须为数组,剩余参数必须在在其他参数之后传入
type arr1 = Array<string||number>
function fn(name:string,age:number,...arg:arr1[])
函数重载
函数重载:使用相同的函数名,不同的参数数量或者类型实现多个方法的一种能力。
在ts中,表现为给同一个函数提供多种不同的函数类型定义
函数体在最后定义,最后定义的函数体类型要包含前面定义的函数参数和返回值类型(即重载签名相同)
function fn(a:string,b:string):string;
function fn(a:number,b:number):number;
function fn(a:string|number,b:string|number):string|number|void{
if(typeof a =='string'&&typeof b=='string'){
return a+b;
}
if(typeof a=='number'&&typeof b =='number'){
return a+b;
}
}
function show(){
let a:number;
let b:string;
a = fn(1,2);
b = fn('1','2');
}
类
接口
接口既可以在面向对象编程中表示为
行为的抽象,也可以用来描述对象的形状
对象的形状
interface ISpeakable{
speak():void,
name:string,
name?:string //表示属性可选
}
行为的抽象
接口可以把一些类中共有的属性和方法抽象出来,可以用来约束实现此接口的类
一个类可以实现多个接口,一个接口也可以被多个类实现
我们用implements关键字来代表 实现
interface speakable{
speak():void
}
interface eatable{
eat():void
}
class animal implement speackable eatable{
//必须实现接口中的所有方法
speak();
eat();
}
定义任意属性类型
接口的继承
函数类型接口
用接口来定义函数
interface count{
(price:number):number
}
let coat:count = function (price:number){
return price++;
}
//接口定义函数重载
`?????`
泛型
泛型(Generics)是指在定义函数、接口或类的时候,不预先指定具体的类型,而在使用的时候再指定类型的一种特性
//声明
function fn<T>(value:T):T{
return value;
}
function log(){
//使用
fn<number>(1);
}
//默认泛型
function fn<T=string>(value:T):T{return value}