【TypeScript】类型系统

目录

前言

基本类型

boolean类型

string 类型

number类型

bigint 类型

 symbol类型

object类型

undefine、null类型

包装对象类型

        包装对象的概念


前言

        TypeScript 的语言服务, 也被称为 tsserver,提供了各种功能,例如错误报告、诊断、保存时编译、重命名、跳转到定义、补全列表、签名帮助等。 它主要由集成开发环境 (IDE) 使用来提供 IntelliSense 支持。它与 Visual Studio Code 无缝集成,并由 Conquer of Completion (Coc) 等工具使用。

        开发人员可以利用专用 API 并创建自己的自定义语言服务插件来增强 TypeScript 编辑体验。这对于实现特殊的 linting 功能或启用自定义模板语言的自动完成特别有用。

基本类型

JavaScript 语言(注意,不是 TypeScript)将值分成 8 种类型。

  1. boolean
  2. string
  3. number
  4. bigint
  5. symbol
  6. objectd
  7. undefine
  8. null

        TypeScript 继承了 JavaScript 的类型设计,以上 8 种类型可以看作 TypeScript 的基本类型。

注意,上面所有类型的名称都是小写字母,首字母大写的NumberStringBoolean等在 JavaScript 语言中都是内置对象,而不是类型名称

另外 undefined null 既可以作为值,也可以作为类型,取决于在哪里使用它们。

boolean类型

boolean只包含两个值:  true 、false

let hiyooo:boolean = true;
let closeths:boolean = false;

hiyooo  = "hello,world" // 报错,string 不能赋值给boolean类型

string 类型

string 类型代表字符串类型

let hiyooo:string = "hiyooo"

number类型

number类型包含所有整数和浮点数。(包括:整形,浮点型和非十进制)

let hiyooo:number = 1;
let yooo:number = 1.2;
let ooo:number = 0xffff;

bigint 类型

bigInt 表示无法用 number 表示的非常大的数值 (253 – 1)。bigInt 可以通过调用内置函数 BigInt() 或添加 n 到任何整数数字字面量的末尾来创建:

语法:在一个整数字面量后加 n 的方式定义一个 BigInt

let hiyooo:bigint = 123n
let yooo:bigint = 0xffffn

bigint和number来不同:

  • BigInt 不能用于 Math 对象中的方法。
  • BigInt 不能和任何 Number 实例混合运算,两者必须转换成同一种类型。
  • BigInt 变量在转换为 Number 变量时可能会丢失精度。

 symbol类型

symbol 类型包含所有Symbol值 ,

JavaScript 有一个原始函数 Symbol(),它创建一个全局唯一的引用。

const hiyooo:symbol = Symbol('hiyooo');

object类型

根据 JavaScript 的设计,object 类型包含了所有对象数组函数

let hiyoooObj :object = {name:"hiyooo",age:40}
let hiyooo:object = [1,2,4]
let hiyoooFn:object = (name:string,age:nubmer)=>void

undefine、null类型

undifne 和null 是两种独立的类型。  

undifne :表示还未定义,以后可能会定义 

null 表示此值包含了一个空值,即没有值

let hiyooo:undefine = undefine;
let hiyooo:null = null;

/**
*  注* 如果没有声明类型的变量被赋值了undifne或null的时候,TypeScript会把此变量的值推断为any
*/

let hiyooo = undifine // any

如果希望避免此种情况 ,可以设置strictNullChecks:true


包装对象类型

        包装对象的概念

        JavaScript 的 8 种类型之中,undeine和null是两种特殊类型值,object属于复合类型,剩下和五种属于原始类型,代表最基本、不可再分的值。

  1. boolean 
  2. string
  3. number
  4. bigint
  5. symbol

         上面这五种原始类型的值,都有对应的包装对象(wrapper object)。所谓“包装对象”,指的是这些值在需要时,会自动产生的对象。

console.log("hiyooo".slice(1,2)) //输出“i“

        上面示例中,字符串hello执行了slice()方法。但是,在 JavaScript 语言中,只有对象才有方法,原始类型的值本身没有方法。这行代码之所以可以运行,就是因为在调用方法时,字符串会自动转为包装对象,charAt()方法其实是定义在包装对象上。

        这样的设计大大方便了字符串处理,省去了将原始类型的值手动转成对象实例的麻烦。

        五种包装对象之中,symbol 类型和 bigint 类型无法直接获取它们的包装对象(即Symbol()BigInt()不能作为构造函数使用),但是剩下三种可以。

  1. Boolean()
  2. String()
  3. Number()

         以上三个构造函数,执行后可以直接获取某个原始类型值的包装对象。

let hiyooo = new String("hello,world")
console.log(typeof hiyooo) //"object"

        上面示例中,hiyooo就是字符串hello,world的包装对象,typeof运算符返回object,不是string,但是本质上它还是字符串,可以使用所有的字符串方法。

        注意,String()只有当作构造函数使用时(即带有new命令调用),才会返回包装对象。如果当作普通函数使用(不带有new命令),返回就是一个普通字符串。其他两个构造函数Number()Boolean()也是如此。

包装对象类型与字面量类型

        由于包装对象的存在,导致每一个原始类型的值都有包装对象和字面量两种情况。

"hiyooo";//字面量
new String("hiyooo");//包装对象

        为了区分这两种情况,TypeScript 对五种原始类型分别提供了大写和小写两种类型。

  1. Boolean和boolean
  2. String和string
  3. Number和number
  4. BigInt和bigint
  5. Symbol和symbol

        其中,大写类型同时包含包装对象和字面量两种情况,小写类型只包含字面量,不包含包装对象。 

const hiyooo1:String = "hiyooo";//正常
const hiyooo2:String = new String("hiyooo");//正确

const hiyooo3:string = "hiyooo";//正常
const hiyooo4:string = new String("hiyooo");//错误 

        上面示例中,String类型可以赋值为字符串的字面量,也可以赋值为包装对象。但是,string类型只能赋值为字面量,赋值为包装对象就会报错。

        建议只使用小写类型,不使用大写类型。因为绝大部分使用原始类型的场合,都是使用字面量,不使用包装对象。而且,TypeScript 把很多内置方法的参数,定义成小写类型,使用大写类型会报错。

Object 类型与 object 类型

        TypeScript 的对象类型也有大写Object和小写object两种。

Object类型

        Object 类型(大写O)是Javascript中的广义对象,所有可以转成对象的值,都是Object。

let hiyoooObject:Object;
hiyoooObject = true
hiyoooObject = "hiyooo"
hiyoooObject = 1
hiyoooObject = {hiyooo:"hiyooo"}
hiyooo=[1,2]
hiyooo = (name:string) => name

hiyooo = undefine //报错 Type 'undefined' is not assignable to type 'Object'.(2322)
hiyooo = null // error:Type 'null' is not assignable to type 'Object'.(2322)

        上面示例中,原始类型值、对象、数组、函数都是合法的Object类型。(除了 undefine和null,不可以赋值给Object,其它值都可以)

object类型

        object是JavaScript中的狭义对象, 可以用字面量来表示的对象,只包含:对象数组、和函数,不包括原始类型的值

let hiyooo1:object;
hiyooo = {obj:"123"}
hiyooo = [1,2]
hiyooo = (name:string) => name;
hiyooo = 1 // error Type 'number' is not assignable to type 'object'.(2322)
hiyooo = "hiyooo" // error  Type 'number' is not assignable to type 'object'.(2322)
hiyooo = true //error Type 'boolean' is not assignable to type 'object'.(2322)

        大多数时候,我们使用对象类型,只希望包含真正的对象,不希望包含原始类型。所以,建议总是使用小写类型object,不使用大写类型Object


undefined 和 null 的特殊性

   undefinednull既是值,又是类型。

        作为值,它们有一个特殊的地方:任何其他类型的变量都可以赋值为undefinednull

        在使用的时候 ,需要注意

let hiyooo:object = undifine
obj.toString() // 这里正常编译的时候没有问题,只是运行就报错。

        如果想要避免这种情况的时候 ,我们可以在tsconfig.json中配置 trictNullchecks :true,这样,当我们给变量赋值的时候 ,就出报错,避免运行时出错 


值类型

TypeScript 规定,单个值也是一种类型,称为“值类型”。

let hiyooo:"hiyooo"

hiyooo = "hiyooo"

hiyooo = "tao bao "//error Type '"tao bao "' is not assignable to type '"hiyooo"'

        TypeScript 推断类型时,遇到const命令声明的变量,如果代码里面没有注明类型,就会推断该变量是值类型

//此时 hiyooo 的类型就是 hiyooo
const hiyooo = "hiyooo"

//此时 hiyooo 的类型就是string 
const hiyooo:string = "hiyooo"

        这样推断是合理的,因为const命令声明的变量,一旦声明就不能改变,相当于常量。值类型就意味着不能赋为其他值。


联合类型

        联合类型(union types)指的是多个类型组成的一个新类型,使用符号|表示。

        联合类型A|B表示,任何一个类型只要属于AB,就属于联合类型A|B

let hiyooo : string | number ; 

hiyooo = 123 // 可以正常赋值
hiyooo = "淘宝搜索 hiyooo 男装,马上开业" ; // 也可以正常赋值,

        上面示例中,变量x就是联合类型string|number,表示它的值既可以是字符串,也可以是数值。

        联合类型可以与值类型相结合,表示一个变量的值有若干种可能。

let hiyooo : "hiyooo" | "taobao" 

let color: "red" | "yellow" | "blue"

// 此时color 代表 ”red" "yellow" "blue" ,如果其它值 ,则会报错是

交叉类型

        交叉类型是表示具有两种或多种类型的所有属性的值的类型。交叉类型在每种类型之间使用 & 符号表示。

        

let hiyooo:string & number ; 

hiyooo = "hiyooo"

console.log(typeof hiyooo) // 输出string 

//所以,此时的hiyooo,表示即是string 又要是number , 当然这种是不合理的,所以TypeScript会认为hiyooo 是naver 类型。

        交叉类型的主要用途是表示对象的合成。

let hiyooo :{name:"hiyooo"} &{age:40};
console.log(hiyooo);
let hiyooo:{name:"hiyooo"} & {age:40}
hiyooo = {
    name:"hiyooo",
    age:40
}

console.log(hiyooo)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值