目录
前言
TypeScript 的语言服务, 也被称为 tsserver,提供了各种功能,例如错误报告、诊断、保存时编译、重命名、跳转到定义、补全列表、签名帮助等。 它主要由集成开发环境 (IDE) 使用来提供 IntelliSense 支持。它与 Visual Studio Code 无缝集成,并由 Conquer of Completion (Coc) 等工具使用。
开发人员可以利用专用 API 并创建自己的自定义语言服务插件来增强 TypeScript 编辑体验。这对于实现特殊的 linting 功能或启用自定义模板语言的自动完成特别有用。
基本类型
JavaScript 语言(注意,不是 TypeScript)将值分成 8 种类型。
- boolean
- string
- number
- bigint
- symbol
- objectd
- undefine
- null
TypeScript 继承了 JavaScript 的类型设计,以上 8 种类型可以看作 TypeScript 的基本类型。
注意,上面所有类型的名称都是小写字母,首字母大写的Number
、String
、Boolean
等在 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属于复合类型,剩下和五种属于原始类型,代表最基本、不可再分的值。
- boolean
- string
- number
- bigint
- symbol
上面这五种原始类型的值,都有对应的包装对象(wrapper object)。所谓“包装对象”,指的是这些值在需要时,会自动产生的对象。
console.log("hiyooo".slice(1,2)) //输出“i“
上面示例中,字符串hello
执行了slice()
方法。但是,在 JavaScript 语言中,只有对象才有方法,原始类型的值本身没有方法。这行代码之所以可以运行,就是因为在调用方法时,字符串会自动转为包装对象,charAt()
方法其实是定义在包装对象上。
这样的设计大大方便了字符串处理,省去了将原始类型的值手动转成对象实例的麻烦。
五种包装对象之中,symbol 类型和 bigint 类型无法直接获取它们的包装对象(即Symbol()
和BigInt()
不能作为构造函数使用),但是剩下三种可以。
- Boolean()
- String()
- 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 对五种原始类型分别提供了大写和小写两种类型。
- Boolean和boolean
- String和string
- Number和number
- BigInt和bigint
- 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 的特殊性
undefined
和null
既是值,又是类型。
作为值,它们有一个特殊的地方:任何其他类型的变量都可以赋值为undefined
或null
。
在使用的时候 ,需要注意
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
表示,任何一个类型只要属于A
或B
,就属于联合类型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)