TypeScript学习

本文介绍了TypeScript的安装步骤,包括使用npm安装、查看版本和初始化项目。接着,讲解了TypeScript的基本数据类型,如number、string、null、undefined等,并讨论了严格模式下的类型限制。此外,还提到了ts-node的使用、any和unknown类型的差异,以及object与Object的区别。文章还深入探讨了函数的定义、参数、this类型以及函数重载的概念。最后,涉及了联合类型、交叉类型和类型断言的运用。
摘要由CSDN通过智能技术生成

TypeScript是Javascript的超类,由微软公司开发,在这里简称为TS
首先进行TS的安装

npm  i typescript -g

查看ts版本

tsc -v

书写代码前先初始化

tsc --init

执行ts代码,这里w是watch的意思,旨在监听当前ts文件的变化

tsc -w

会发现没有达到预期输出,因为node是不识别ts的需要使用node执行由tsc -w命令生成的目标文件的js文件

//使用node
node 目标.js
//使用nodemon
nodemon 目标文件.js

如何关闭ts的严格模式
执行过ts --init命令后会生成一个tsconfig.json文件中有一个"strict": true, 当值是true是开启状态

基础类型

//ts中的数据类型
let notANumber: number = NaN;//Nan
let num: number = 123;//普通数字
let infinityNumber: number = Infinity;//无穷大
let decimal: number = 6;//十进制
let hex: number = 0xf00d;//十六进制
let binary: number = 0b1010;//二进制
let octal: number = 0o744;//八进制s
let str:string='小海'//字符串
let n:null=null//空类型,就是定义了赋值为空,不可赋值
let b:undefined=undefined//未定型,就是定义了但未赋值,可赋值
let n2:void=undefined//void运算符对给定的表达式进行求值,然后返回undefined
let n1:void=null//这里就用到了严格模式,因为void返回的是undefined所以不能给他赋值为空,严格模式开启不能这么赋值,严格模式关闭了就可以这么赋值了

全局安装"ts-node"环境
安装它的原因是ts自带的tsc命令不能直接运行ts代码。但是要注意ts-node不等于node.js仅仅是封装了ts的编译过程,提供直接运行ts代码的能力

npm install -g ts-node

ts声明文件

npm i @types/node -D

讲解任意类型

// any 任意类型 unknown 不知道的类型
//1,top type 顶级类型 any unknown
//2,Object
//3,Number String Boolean
//4,number string boolean
//5, 9     "小海"  true
//6,never
// unknown 只能赋值给自身 或者any
// unknown 没办法读任何属性 方法也不可以调用
// unknown 比 any 类型更加的安全
unknown类型属性无法读取也不能调用的举例
let info:unknown={name:'小海'}
console.log(info.name);

unknown只能赋值给自身或者any类型

unknown类型无法访问调用
unknown和any之间定义的类型能互相交换,或者说赋值

object和Object的区别

object类型表示非原始对象,number,string,boolean,symbol,null或undefined在JavaScript中为原始类型

//举例
let a5:object=123//错误 原始类型
let a6:object="123"// 错误 原始类型
let a7:object=false// 错误 原始类型
let a8:object=[]//正确
let a9:object={}//正确
let a10:object=()=>212//正确

Object类型是所有Object类的实例类型,简单来说就是Object就是一个对象,但是它包含了js原始的所有公用的功能

//举例
let a:Object=123//数字型
let a1:Object="123"//字符串型
let a2:Object=[]//数组型
let a3:Object={}//空对象型
let a4:Object=()=>212//Function型
  • Object 接口定义了Object.prorotype原型对象上的属性
    在这里插入图片描述
    Object 类的所欲哦实例都继承lObject接口中的所有属性
    在这里插入图片描述
    再来说以下空对象{}
    空对象:它描述了一个没有成员的对象。当你访问任何属性时TS中都会编译报错。但是你可以使用Object类型上所有的属性和方法,这些属性和方法可通过JavaScript的原型链隐晦式的使用在这里插入图片描述
    在JavaScript中可以给空对象进行赋值,但是TypeScript中会报错
    在这里插入图片描述
    因为上面a的类型是{}推断出来的,它能对已有的属性赋值。如果需要进一步创建对象,我们可以使用类型断言as来消除TypeScript的类型检查

在这里插入图片描述

最好是在声明对象过程中一次性构建好
在这里插入图片描述
它和Object很像,可以包含任何类型

let a11:{}=123
let a12:{}="123"
let a13:{}=[]
let a14:{}={}
let a15:{}=()=>212

函数类型

//1.函数定义类型和返回值 | 箭头函数定义类型和返回值
//2.函数默认的参数 | 函数可选参数
//3.参数是一个对象如何定义
//4.函数this类型
//5.函数重载

  1. 函数定义类型和返回值 | 箭头函数定义类型和返回值
//函数定义类型和返回值
function add(a: number, b: number): number {
    return a + b
}
console.log(add(2, 4));
//箭头函数定义类型和返回值
const add_ = (a: number, b: number): number => {
    return a + b
}
console.log(add_(5,6));

在函数中{}叫做块级作用域,当箭头函数就一句话时可以省略掉花括号同时也不用加return,里面会有一个隐晦的return返回

  1. 函数默认的参数 | 函数可选参数
//给函数参数定义默认值
const add_add = (a: number=1, b: number=7): number => {
    return a + b
}
console.log(add_add());
//可选参数和默认值不能混用,这里会报错,请看下图
const add_a = (a: number=1, b?: number=7): number => {
    return a + b
}
console.log(add_a());

可选参数和默认值参数不能混用

//可选参数和默认值不能混用,可选参数得放在最后
const add_a = (a: number=10, b?: number): number => {
    if(b!==undefined){
        return a+b
    }else{
        return a
    }
     
}
console.log(add_a(9,2));
  1. 参数是一个对象如何定义
//函数的参数是一个对象形式
interface X{
    name:string
    age:number
}
function add_ad(user:X):X{
    return user
}
console.log(add_ad({name:'小海',age:1}));
  1. 函数this类型
//ts可以定义this类型,在js中无法使用,必须是第一个参数定义this类型
interface Obj{
    user:number[]
    add:(this:Obj,num:number)=>void
}
let obj:Obj={
    user:[1,2,3],
    add(this:Obj,num:number){
        this.user.push(num)
        return this.user
        
    }
}
obj.add(4)
console.log(obj.user);
  1. 函数重载
//函数重载举例
let user: number[] = [1, 2, 3, 4, 5]
function findNum(add: number[]): number[]//如果传的是一个number类型的数组那就做添加
function findNum(id: number): number[]//如果传入的是一个id就是查询单个
function findNum(): number[]//如果没有传入东西就是查询全部
function findNum(ids?: number | number[]): number[] {
    if (typeof ids == 'number') {
        return user.filter(v =>v == ids)
    } else if (Array.isArray(ids)) {
        user.push(...ids)
        return user
    } else {
        return user
    }
}
console.log(findNum());
console.log(findNum(2));
console.log(findNum([5,6,7,8]));

Array.isArray(被判别对象)//判断传入的参数是否是数组类型

联合类型 | 类型断言 | 交叉类型

联合类型标识定义的变量可以是同属于两个类型

实际需求在存储一些座机号时,既属于字符串又属于数字类型

所以我们就可以使用联合类型支持座机字符串

let phone:number | string = '0310-78421'
//联合类型,后端可以给字符串也可以给Boolean值类型 “|”在这里指的是或的意思
let fn=function(type:number | boolean):boolean{
    return !!type
}
let result=fn(1)
console.log(result);

交叉类型(有点继承的那个味道了)
提示小海这个对象实例中的参数man这个参数包含了People和Man类型实例

//交叉类型
interface People{
    name:string
    age:number
}
interface Man{
    sex:number
}
const xiaohai=(man:People & Man):void=>{
    console.log(man);
    
}
xiaohai({name:'小海',age:1,sex:1})

类型断言
就是ts相较于js是个强类型的语言他会判断你定义的类型,如果你定义的不对会提示错误那类型断言就是告诉ts我不认同他的判定规则,我就认为我定义的是什么类型
就像这个例子

//用的联合类型类型既可以是数字又可以是字符串,但是ts判断把num判定为了number类型所以不能用length这个方法
let func=function(num:number | string):void{
    console.log(num.length);
}
func('123124')

在这里插入图片描述
这里由类型断言一下

let fun=function(num:number | string):void{
    console.log((num as string).length);
}
fun('123124')

这里虽然不报错了但是也存在一个问题
在这里插入图片描述
这里联合类型我可以传入字符串或者数字类型,但是我在这里把num断言为了字符串类型所以传入给num一个数组最后会返回一个undefined
这里应该对断言有一个深入了解了,我理解为强制干预ts的判定规则,告诉它这个类型是什么类型,但是要慎用

interface A {
    run: string
}
interface B {
    build: string
}
let func = (type: A | B): void{
    console.log(type.run);
}

在这里插入图片描述
这段代码给type定义为联合类型的对象,但是会提示B上没有这个run这个属性,他的判定有点先数学中的取交集必须两给都有才行,那还可以给对象加一个对象类型的断言,但是没什么乱用该报错还是爆粗,只是欺骗了下编译器罢了😄(骗骗兄弟可以,别把自己给骗了)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值