什么是 TypeScript · TypeScript 入门教程从 JavaScript 程序员的角度总结思考,循序渐进的理解 TypeScript。http://ts.xcatliu.com/introduction/what-is-typescript.html
5分钟上手TypeScript · TypeScript中文网 · TypeScript——JavaScript的超集https://www.tslang.cn/docs/handbook/typescript-in-5-minutes.html
js是动态类型弱类型语言,而ts是静态类型弱类型语言。
强类型语言:不允许改变变量的数据类型,除非进行强制类型转换。
弱类型语言:变量可以被赋予不同的值。
静态类型语言:在编译阶段确定所有变量的类型。
动态类型语言:在执行阶段确定所有变量的类型。
ts的好处:
在编译阶段即可暴露出大部分错误,致使可维护性增强。因此使得ts在多人合作的大型项目中可以获得更好的稳定性和开发效率。js的代码都可以在ts里面运行
可以用vue的ts插件包,也可以全局安装
npm install -g typescript
查询当前版本信息-命令
tsc
ts文件转换成js文件
tsc greeter.ts
原始类型:number、 string、布尔 、null、undefined、symbol
对象类型:object(数组、对象、函数等)
es6新增类型:Symbol 表示独一无二的值
es10新增类型:BigInt 可以表示任意大的整数
typeof 1n === 'bigint'; // true
typeof BigInt('1') === 'bigint'; // true
let a = 'hhh' //string
let b = 666 //number
let c = true //boolean
let d = null //null
let e = undefined //undefined
let f = {name:'maobuhui'} //object
let h = Symbol() //Symbol
let a:string = 'hhh'
let b:number = 666
let c:boolean = true
let d:null = null
let e:undefined = undefined
let f:object = {name:'maobuhui'}
let g:bigint = 100n
let h:symbol = Symbol()
let a: string | number;
a= 'seven';
a= 7;
//定义:
interface videoItem {
author: string
authorIconSrc?: string //可选参数
}
//使用,格式必须和定义的接口一致,对象多一些属性,少一些都不行,除非加了 ?:的可传可不传
let tom: videoItem= {
author: 'Tom'
};
let a: number[] = [1, 1, 2, 3, 5]; //如果出现其他类型会报错
手动指定值的具体类型
//使用类型断言
s = e as string
或者:
s = e
案例:
获取 DOM 元素的时候指定具体元素
const box = document.getElementById('img') as HTMLImageElement
指定了具体类型后 , 就可以使用 box.src 了
非空断言: 明确地知道对象的属性一定不会为空,可以使用非空断言 !
console.log(inputRef.current!.value)
//正常情况下,通过document.getElementById获取元素,有可能获取不到,
但是加上!非空断言就表示是一定能获取到的
let a = document.getElementById('main')!
基础用法
let x: [string,number]
x = ['a',123]
x = [123,'a']//error
x = [123,123,'a']//error
可选参数
let x:[string,number?]
x = ['a']
x = ['a', 123]
剩余元素
let x:[number,...string[]]
x = [123,"q","w","e"]
只读
let x:readonly[number,string] = [123,"q"]
//此时对x进行任何修改都会抛出异常
枚举使用 enum
关键字来定义
ts的class类的使用与继承, es6新增的class类_浩星的博客-CSDN博客ts的class类的使用与继承, es6新增的class类https://blog.csdn.net/qq_41619796/article/details/129853838?spm=1001.2014.3001.5501
什么是泛型
顾名思义就是多个类型 , TS 中指使用变量保存要使用的类型
泛型本质
泛型本质是参数化类型 , 就是所操作的数据类型被指定为一个参数,这种参数类型可以用在类、接口和函数的创建中,分别成为泛型类,泛型接口、泛型函数
定义泛型函数 :
function 函数名<类型参数> (形参:类型参数):类型参数{}
在函数名称的后面写 <>(尖括号),尖括号中添加类型变量
类型变量相当于一个类型容器,能够捕获用户提供的类型(具体是什么类型由用户调用该函数时指定)
使用泛型函数
方法1: const 返回值 = 函数名(实参) 类型推论实参的类型,传递给类型参数
方法2 : const 返回值= 函数名<类型实参>(实参) 上述的非空断言就使用了此种方法
此时的 <> 中的就是具体的类型
//参数a,b,函数返回值的类型都申明为number类型,如果传参中有非number类型的数据,
则会显示红色波浪线
function sum(a: number, b: number): number {
return a + b
}
console.log(sum(1, 9)); //10
//此处的a相当于const定义的,a的值永远为10
let a: 10;
//b的值只能为 'male'或者'female'
let b: 'male' | 'female'
//b的值只能为 boolean类型或者string类型
let c: boolean | string
//any 表示任意类型,可以给d赋上任意类型的值(相当于对d关闭了TS的类型检测)
let d: any
d = true
//等同于 let d
let s: string
s = d // d是any类型,s也变成了any类型(所以开发中尽量避免使用any)
//unknown 表示未知类型,也可以给d赋上任意类型的值
let e: unknown
e = 'hellow'
let s: string
//s = e
// 语法检测不通过,因为s是string类型,e是unknown类型,它们类型不用,不允许直接赋值
//如果就是想把e的值赋给s,有两种解决办法
方法一:
if(typeof e === "string") {
s = e
}
方法二:
// 使用类型断言
s = e as string
或者:
s = e
// void 用来表示空,以函数为例,就表示没有返回值
function fn(): void {
}
function fn(): void {
//return undefined
//return;
//return null
}
函数一旦报错就立即终止,never用的很少
// {} 用来指定对象类型
let a: {name: string}
// a中有且只有name属性,且name值必须为string类型
a = {name: '猪八戒'}
let b: {name: string, age?: number}
// b中必须有name属性,且name值必须为string类型;age可有可无;
b = {name: '猪八戒'}
或者
b = {name: '猪八戒', age: 18}
let c: {name: string, [propName: string]: number}
// b中必须有name属性,且name值必须为string类型;剩余属性的个数,
属性名不做要求,但是必须是number类型
c = {name: '猪八戒', haha: 12, xixi: 99}
// () => {} 用来指定函数对象类型
let d: (a: number, b: number)=>number
//函数d只接收两个number类型的参数,且返回值必须为number类型
d = function(n1: number, n2: number): number {
return n1 + n2
}
// [] 用来指定对数组类型
let a: number[]
等同于
let a: Array
a = [1,3,6,5,9]
//tuple是元组(ts新增),元组表示固定长度的数组
let a: [string, number]
//数组a中只有两个元素,第一个为string类型,第二个为number类型
a = [1, '2']
//enum是枚举(ts新增)
enum Gender{
male,
female
}
let a: {name: string, gender: Gender}
a = {name: '猪八戒', gender: Gender.male}
// & 表示同时
let a: {name: string} & {age: number}
等同于
let a: {name: string, age: number}
//对象a中必须同时有name和age,且类型为指定类型
a = {name: '猪八戒', age: 18}
//类型的别名
type myType = 1 | 2 | 3
let a: myType
let c: mType
a = 1, c = 3
// a、c的值为1或2或3,都行