当前位置: 首页 > article >正文

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
 }


http://www.kler.cn/a/553728.html

相关文章:

  • hbuilderx 小程序分包_微信小程序关于分包【收藏版】
  • 【Java】Enum类的常用方法、实现接口及其实际应用
  • 小胡说技书博客分类(部分目录):服务治理、数据治理与安全治理对比表格
  • DeepSeek与ChatGPT:AI语言模型的全面技术解析与对比
  • Matlab离线安装硬件支持包的方法
  • 68页PDF | 数据安全总体解决方案:从数据管理方法论到落地实践的全方位指南(附下载)
  • LLaVA-CoT: Let Vision Language Models Reason Step-by-Step论文解读
  • 基于知识图谱的问答系统:后端Python+Flask,数据库Neo4j,前端Vue3(提供源码)
  • AI赋能传统系统:Spring AI Alibaba如何用大模型重构机票预订系统?
  • SpringBoot启动java.nio.charset.MalformedInputException: Input length = 1报错的解决方案
  • Function.prototype.__proto__==Object.prototype
  • 文心一言,下一代模型开源
  • Android Hal AIDL 简介 (一)
  • 什么是Ajax
  • AI 安全时代:SDL与大模型结合的“王炸组合”——技术落地与实战指南
  • 动静态链接与加载
  • GPT-SoVITS更新V3 win整合包
  • 【云原生】SpringCloud-Spring Boot Starter使用测试
  • CST案例:UAV无人机RCS --- 双站,I求解器,比例缩放
  • 大模型驱动的业务自动化