TypeScript学习:初学

安装等配置指令

安装TypeScript

npm i typescript -g

检查版本

tsc -v npx tsc -v

运行ts文件及js文件

npx tsc 文件名.ts node 文件名.js

安装ts-node脚手架

npm i ts-node -g

检查脚手架版本

npx ts-node -v

初始化ts状态

npx tsc -- init

使用脚手架运行ts文件

npx ts-node 文件名.ts

语法

类型注解

let 变量名:类型名 = 值

let age = 18->let age:number = 18

只能赋值相同类型

age = '张三' 报错:类型错误

其他基本数据类型

let name:name = '张三'

let isfalse:boolean = false

let un:undefined = undefined

数组写法

let arr:number[] = [1,2,3]

let arr:(string | number)[] = [1,2,3,'4']

let arr:Array<number | string> = [1,2,3,'4']

类型别名

type CustomPerson = Array<number | string | boolean>

let arr:CostomPerson = [1,'2',true]

函数类型
复制代码
 function add(a:number,b:number):number{
     return a+b;
 }
 add(1,2)

return '1' 报错:因为要求返回的数据是number类型

add('1',2) 报错:因为要求传入的数据是number类型

键勾函数
复制代码
 const add = (a:number,b:number):number =>{
     return a+b
 }
可通过类型别名来同时指定
复制代码
 type CustomAdd = (a:number,b:number)=>number;
 ​
 const add:CustomAdd = (number1,number2)=>{
     return number1+number2
 }
void类型

void函数在不需要返回值的时候使用

复制代码
 function sayHi(str:string):void{
     consolr.log(str)
 }
可选参数

参数前加"?"表示可选参数

我不知道传入的参数,就把要求传入的参数改为可以传可以不传

必选参数不可以放在可选参数的后面

复制代码
 function createPerson(name:string,age?:number):void{
     console.log(`名字是${name},年龄为${age}`)
 }
 ​
 createPerson('张三')
对象类型
复制代码
 let person :{
     name:string
     age:number
     sayHi(str:string):void
 }={
     name : '张三',
     age : 18,
     sayHi(str){
         console.log(`${str}`)
     }
 }
 ​
 person.sayHi('hello')
类型别名适用
复制代码
 type CostomPerson = {
     name:string,
     age:number,
     sayHi(str:string):void
 }
 ​
 let person:CostomPerson = {
     name : '张三',
     age : 18,
     sayHi(str){
         console.log(`${str}`)
     }
 }
 ​
 person.sayHi('hello')
键勾函数适用
复制代码
 type CostomPerson = {
     name:string,
     age:number,
     sayHi:(str:string)=>void
 }
 ​
 let person:CostomPerson = {
     name : '张三',
     age : 18,
     sayHi(str){
         console.log(`${str}`)
     }
 }
 ​
 person.sayHi('hello')
可选参数适用
复制代码
 type CostomPerson = {
     name:string,
     age:number,
     hobby?:Array<string>,
     sayHi(str:string):void
 }
 ​
 let person:CostomPerson = {
     name : '张三',
     age : 18,
     sayHi(str){
         console.log(`${str}`)
     }
 }
 ​
 person.sayHi('hello')
接口

interface关键字来声明接口

复制代码
 interface CustomPerson {
     name:string
     age:number
 }
 ​
 let person:CustomPerson = {
     name : '张三',
     age : 18
 }
继承
复制代码
 // 继承 继承另一个类型的所有属性
 interface CustomPerson1 extends CustomPerson{
     songs : string
 }
 let star:CustomPerson1 = {
     name : 'aaa',
     age : 19,
     songs : '凤凰传奇'
 }
元组
复制代码
 let position : [number,string] = [1,'1']
 ​
 // 类型推论,根据值反推出类型
 let age = 18
 // age = '111'
字面量类型

当类型别名被固定定义时,输入别的值就会报错

复制代码
 {
     let str = 'hello'
     const str1 = 'hello'
 ​
     // 贪吃蛇游戏
     type fangxiang = 'down' | 'up' | 'left' | 'right'
     function move (driection:fangxiang){
         console.log(driection)
     }
     move('down')
     // move('aaa')
 }
泛型

传入什么数据类型 返回什么数据类型

注册泛型函数,在变量名后加<type>,type为类型名

复制代码
 function fn<type> (value:type):type{
     return value
 }
调用

声明什么类型,就要用到什么类型

let res = fn<number>(10)

let res = fn<string>('a')

一般能推断的函数类型,简化即可

let res = fn(2)

其他属性调用无效

泛型函数的类型变量 Type 可以代表多个类型,这导致无法访问任何属性

console.log(value.length) 报错:因为不认识length属性

添加约束

添加一个接口,使length属性可以被继承到定义的函数中

复制代码
 interface havelength  {
     length : number
 }
 ​
 function fn1<type extends havelength> (value:type):type{
     console.log(value.length)
     return value
 }

在调用时,只用有length属性的,在调用时才不会报错

像数字无length属性的,就会报错

let res4 = fn1(2) 报错:因为数字无length属性

let res5 = fn1('abc')

let res6 = fn1([1,2,3,4,5])

多个类型变量

在传入一个对象与其对象之中的子属性时,一般情况下不能正常使用

这需要我们添加一个约束,让key的值始终在obj里面

复制代码
 function getValue<Type,Key extends keyof Type>(obj:Type,key:Key){
     return obj[key]
 }
 ​
 getValue({name:'zs',age:18},'name')

在未限制对象之前,如果引用的第一个参数不符合条件,反而会在第二个参数报错,那么我们就要对第一个参数也进行约束

复制代码
 // 继承js中object属性,使第一个参数满足object
 function getValue1<Type extends object,Key extends keyof Type>(obj:Type,key:Key){
     return obj[key]
 }
 // 这样在引入时就会报第一个参数的错误
 // getValue1('aaa','b')
泛型接口

但我们在定义了一个固定类型的接口是,泛用性太差,因此我们就需要使用泛型接口在进行泛用

未运用泛型

复制代码
 // 定义了一个接口
 interface MyArray100 {
     length : number
     push(value:number):number
     pop():number
     reverse():number[]
 }
 ​
 const arr100:MyArray100 = {
     length:10,
     push(n:number){
         return 11
     },
     pop(){
         return 10
     },
     reverse(){
         return [1,2,3]
     }
 }
 ​
 arr100.push(10)

运用泛型

复制代码
 // 定义一个存所有值的泛型接口
 interface MyArray<Type> {
     length : number
     // 返回新的数组长度,所以不用改返回的number类型
     push(value:Type):number
     pop():Type
     reverse():Type[]
 }
 ​
 // 存数字
 // 声明传入的类型
 const arr:MyArray<number> = {
     length:10,
     push(n:number){
         return 11
     },
     pop(){
         return 10
     },
     reverse(){
         return [1,2,3]
     }
 }
 ​
 arr.push(10)
 ​
 // 存字符串
 ​
 // 存布尔值
 ​
泛型工具类型
复制代码
 type Person = {
     name : string,
     age : number
     hobby : string[]
 }

可选

type p = Partial<Person>

只读

type p = Readonly<Person>

单个属性构造

type pickPerson = Pick<Person,'name' | 'age'>

索引签名类型
复制代码
 type Obj = {
     [key : string] :number 
 }
 ​
 let test : Obj = {
     x : 111,
     y : 222
 }
 type Person = {
     [k : string] : string | number
 }
 ​
 let zs : Person = {
     name : 'zs',
     address : 'aaa',
     email : 'aaa',
     age : 18
 }
相关推荐
濮水大叔7 小时前
在大型 Vue 项目中,如何有效管理复杂的状态?“散装版” vs “套装版”
前端·vue.js·typescript
谷哥的小弟1 天前
TypeScript数组类型
javascript·typescript
退休倒计时1 天前
【每日一题】LeetCode 199. 二叉树的右视图 TypeScript
算法·leetcode·typescript
前端之虎陈随易2 天前
编程语言级别的Skill市场,AI Agent 的未来形态
前端·vue.js·人工智能·typescript·node.js
后台开发者Ethan2 天前
类型分类、联合类型、交叉类型
typescript
鹰影473 天前
一款AI笔记助手和远程同步的markdown笔记idea-note
人工智能·笔记·rust·typescript·react
想你依然心痛3 天前
AtomCode 在前端开发中的实战体验:React + TypeScript 项目开发实录
前端·react.js·typescript
疯狂的魔鬼3 天前
精确计算容器剩余视口高度:useAutoContainerFullHeight 的工程实践
前端·css·typescript
后台开发者Ethan3 天前
类型与变量
开发语言·typescript
孤狼warrior3 天前
从冒泡到传送带流水线:一个3D沉浸式算法靶场,让思想的伟力改变世界
python·算法·typescript