TypeScript常用类型

1. 类型注解

示例:

let age:number = 31

说明:代码中的:number就是类型注解。

作用:为变量增加类型约束,表示该变量只能是这个类型,不能用其它类型的值赋值给它,否则报错。

2. 常用基础类型

TS中的常用基础类型可以细分为两类:

  • JS已有类型

    基本类型:number/string/boolean/null/undefined/symbol(es6新增)

    对象类型:object(包括:数组、对象、函数等)

  • TS新增类型

    联合类型、自定义类型(类型别名)、接口、元祖、字面量类型、枚举、void、any等。

3. 基本类型

number/string/boolean/null/undefined/symbol(es6新增)

用法与Js一致,示例:

let age:number = 10
let name:string = '张三'
let isStudent:boolean = false
let ss:null  =null
let abc:undefined = undefined
let dd:symbol = Symbol()
4. 数组类型

示例:

let ages:number[] = [1,2,3]    //推荐该方式写法
let ages2:Array<number> = [1,2,3]

扩展:如果数组中是否可以有多个类型呢?

答案是肯定的,这时可以采用联合类型。

5. 联合类型

通过(xx | xx)方式,如下示例:

let ages:(number | string)[] = [1,2,'a']

注:一定要带小括号,若不带小括号则表示该变量要么是number类型要么是string[]类型。

6. 类型别名

声明:type 别名 = 实际类型

使用场景:当同一类型复杂但又被多次使用时,可以通过类型别名,简化该类型。

关键字:type

示例:

type Num = number
let age:num = 123


type CusArray = (number|boolean)[]
let arr:CusArray = [1,false]
7. 函数类型

指给函数指定参数类型返回值类型

示例:

//方式一:函数声明
function sub(num1:number,num2:number):number{
    return num1 - num2
}
//方式二:函数表达式
const sub = (num1:number,num2:number):number =>{
    return num1 - num2
}

当采用<mark>函数表达式形式</mark>定义函数时还可采用类似给变量指定类型的方式同时指定参数类型、返回值类型,如下示例:

const sub:(num1:number,num2:number):number = (num1,num2)=>{
    return num1 - num2
}

<mark>注意:该方式仅适用函数表达式形式</mark>

可选参数

定义:在函数的参数名称后面增加一个?

特点:可选参数必须放在函数参数的后面,不能后面跟随必传参数。

示例:

function sub(n1:number,n2:number,ret?:number){
    return n1 - n2
}
8. 对象类型

定义:用大括号给属性指定类型,有多个属性 时用;隔开。

如下示例

let person:{name:string;age:number;toString():void} = {
    name:'张三',
    age:10,
    toString(){
        console.log('name:'+name+',age:'+age)
    }
}

<mark>属性还可以采用多行的形式,这时;可省略</mark>,如下写法:

let person:{
    name:string
    age:number
    toString():void
} = {
    name:'张三',
    age:10,
    toString(){
        console.log('name:'+name+',age:'+age)
    }
}

可选属性

函数存在可选变量,对象的属性也存在可选属性,定义方式也是采用关键字?

function output(data:{tag:string;msg?:string}){
    console.log(data.tag+data.msg)
}
9. 接口

定义:采用关键字interface,形式:interface xxx{}.

//声明接口
interface IUser{
    name:string
    age:number
    toString():void
}

//使用接口
let user:IUser={
    name:'张三',
    age:20,
    toString(){
        console.log('xxx')
    }
}

对比:接口(interface)和类型别名(type)区别?

  • 相同点:都可以给对象指定类型。

  • 不同点:

    • 接口,仅为对象指定类型

    • 类型别名,可以为任意类型指定别名,范围更广

继承特性

当两个或多个接口有相同的属性或函数,可以将公共部分单独抽离出来,通过继承方式来实现复用。

关键字:extends

如下示例:

interface IPoint{
    x:number
    y:number
}
//ILine 拥有了x,y属性
interface ILine extends IPoint{
    width:number
}
//ICircle 拥有了x,y属性
interface ICircle extends IPoint{
    radius:number
}
10. 元组类型

定义:是另一种类型的数组,它明确了元素个数和对应索引的类型。

let color:[number,number,number] = [255,255,255]
11. 类型推论

TS中,某些没有明确指定类型的地方,TS可以帮助我们提供类型。所以由于存在类型推论机制存在,在一些场景类型注解是可以省略不写的。

那么什么场景下TS可以对类型进行推论呢?

1.声明变量时并初始化(即赋值情况)

//声明变量并初始化时,可以省略类型注解
let age = 10

2.函数返回值类型明确的时

//函数返回值的类型可以省略
function sub(num1:number,num2:number){
    return num1 - num2
}
12. 类型断言

使用场景:调用函数时,其返回值不是具体的类型。

定义:关键字as,说白了就是类型强制转换

形式:<mark>as [具体类型]</mark>

//常用 as 
const link = document.getElementById('link') as HTMLAnchorElement
//不推荐写法
const link = <HTMLAnchorElement>document.getElementById('link')
13. 字面量类型

定义:采用某些特点的值作为变量的类型的方式即为字面量类型。

// 普通变量 num的类型为number
let num:number = 10

// 常量num1的类型为8,而不是number类型了
const num1 = 8

字面量类型不仅仅适用于number类型,对其它类型同样适用。

适用场景:往往会配合联合类型一起使用,实现一组明确的可选值列表,类似枚举。

//表示参数shape只能是line/circle/rectangle/triangle中的一个值
function createShape(shape:'line' | 'circle' | 'rectangle' | 'triangle'){
    ....
}
14. 枚举

定义:定义一组命名常量,描述一个值,该值可以是这些命名常量中一个。

关键字:enum

说明:功能类似字面量类型+联合类型组合。

//定义枚举
enum Shape{ 
    Line,Circle,Rectangle,Triangle
}

//使用
function createShape(shape:Shape){
    console.log("shape:"+shape)
}

//调用上面函数
createShape(Shape.Line)

注意:枚举成员是有值的,默认为:从0开始自增的数值。

数字枚举:当枚举成员的值为数字

当然也可以给枚举成员初始化值,如下:

//此时值为:Line->3,Circle->4,Rectangle->5,Triangle->6
enum Shape{Line = 3,Circle,Rectangle,Triangle}

//同样可以给每个成员都设置值
enum Shape{Line = 3,Circle=5,Rectangle=8,Triangle=9}

字符串枚举:枚举的成员值为字符串,并且每个成员均需要初始化

enum Shape{
    Line = 'line',
    Circle = 'circle',
    Rectangle = 'rectangle',
    Triangle = 'triangle'
}

值得注意的是:字符串枚举是没有自增长行为的。

上述字符串枚举被tsc命令编译成如下js代码:

var Shape;
(function (Shape) {
    Shape["Line"] = "line";
    Shape["Circle"] = "circle";
    Shape["Rectangle"] = "rectangle";
    Shape["Triangle"] = "triangle";
})(Shape || (Shape = {}));

一般情况下,推荐使用字面量类型+联合类型组合的方式,相比枚举来说会更简洁、直观、高效。

15. any类型

原则:<mark>不推荐使用any</mark>,这会让TypeScript变成'AnyScript',会失去TypeScript的优势。

当使用Any类型时,可以对该对象进行任意操作,并且不会有相关的代码信息提示,包括可能存在的错误。

let obj:any = {a:2}
//以下操作均不会有代码信息提示,包括可能存在的错误信息
obj.y = 10
obj()

注意下两种情况会默认为any类型

  • 当定义一个变量未设置类型注解并且未初始化值时

  • 函数参数不加类型

//这种定义时,obj的类型即为any类型
let obj

//这这种定义,num1 num2即为any类型
function sub(num1,num2){
  ...  
}
16. typeof类型

typeof提供数据类型查询功能,在TS中可以用来查询上下文中<mark>变量或属性</mark>的类型。

let point= {x:1,y:2}

//这种方式表示p可以引用变量point的类型,即通过typeof查询point的类型
function formatPoint(p:typeof point){

}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,277评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,689评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,624评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,356评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,402评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,292评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,135评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,992评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,429评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,636评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,785评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,492评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,092评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,723评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,858评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,891评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,713评论 2 354

推荐阅读更多精彩内容