TypeScript学习:初学

news2025/2/23 11:56:26

安装等配置指令

安装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.coloradmin.cn/o/2303903.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于Martin的全国基础底图实现

概述 前面有文章基于Martin实现MapboxGL自定义底图分享了Martin的使用&#xff0c;本文使用网络收集的数据实现了全国基础数据的收集和基础底图。 实现后效果 实现 1. 数据准备 实例中包含如下数据&#xff1a; 边界线和九段线数据省边界面数据省会城市点数据市边界面数据…

网络安全:防范NetBIOS漏洞的攻击

稍微懂点电脑知识的朋友都知道&#xff0c;NetBIOS 是计算机局域网领域流行的一种传输方式&#xff0c;但你是否还知道&#xff0c;对于连接互联网的机器来讲&#xff0c;NetBIOS是一大隐患。 漏洞描述 NetBIOS(Network Basic Input Output System&#xff0c;网络基本输入输…

一周学会Flask3 Python Web开发-客户端状态信息Cookie以及加密

锋哥原创的Flask3 Python Web开发 Flask3视频教程&#xff1a; 2025版 Flask3 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili HTTP是无状态&#xff08;stateless)协议。也就是说&#xff0c;在一次请求响应结束后&#xff0c;服务器不会留下任何关于对…

机器学习面试八股文——决战金三银四

大家好&#xff0c;这里是好评笔记&#xff0c;公主 号&#xff1a;Goodnote&#xff0c;专栏文章私信限时Free。本笔记的任务是解读机器学习实践/面试过程中可能会用到的知识点&#xff0c;内容通俗易懂&#xff0c;入门、实习和校招轻松搞定。 公主号合集地址 点击进入优惠地…

【Akashic Records】THE EGG

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: Akashic Records 文章目录 &#x1f4af;观后感一、宇宙的孤寂与个人成长&#xff1a;二、选择与责任&#xff1a;三、灵性与世界的连接&#xff1a;四、选择如何改变命运&#xff1a;结语&#xff1a; &#x1f4af;…

从零开始用react + tailwindcs + express + mongodb实现一个聊天程序(一)

项目包含5个模块 1.首页 (聊天主页) 2.注册 3.登录 4.个人资料 5.设置主题 一、配置开发环境 建立项目文件夹 mkdir chat-project cd chat-project mkdir server && mkdir webcd server npm init cd web npm create vitelatest 创建前端项目时我们选择javascrip…

ant design 疑惑记录 Dropdown.Button

onMenuClick是点击展开的 子项的点击事件 Actions的点击事件是什么&#xff1f; 解答&#xff1a; 也是个按钮Button&#xff0c;也有自己的onClick事件 const onMenuClick (e) > {console.log(click, e); }; const otherClick (e) > {console.log(其他操作主按钮…

SAP on Microsoft Azure Architecture and Administration (Ravi Kashyap)

SAP on Microsoft Azure Architecture and Administration (Ravi Kashyap)

Missing required prop: “maxlength“

背景&#xff1a; 封装一个使用功能相同使用频率较高的input公共组件作为子组件&#xff0c;大多数长度要求为200&#xff0c;且实时显示统计子数&#xff0c;部分input有输入提示。 代码实现如下&#xff1a; <template><el-input v-model"inputValue" t…

在windows下安装windows+Ubuntu16.04双系统(下)

这篇文章的内容主要来源于这篇文章&#xff0c;为正式安装windowsUbuntu16.04双系统部分。在正式安装前&#xff0c;若还没有进行前期准备工作&#xff08;1.分区2.制作启动u盘&#xff09;&#xff0c;见《在windows下安装windowsUbuntu16.04双系统(上)》 二、正式安装Ubuntu …

数据库驱动免费下载(Oracle、Mysql、达梦、Postgresql)

数据库驱动找起来好麻烦&#xff0c;我整理到了一起&#xff0c;需要的朋友免费下载&#xff1a;驱动下载 目前收录了Oracle、Mysql、达梦、Postgresql的数据库驱动的多个版本&#xff0c;后续可能会分享更多。

业务流程相关的权威认证和培训有哪些

业务流程的认证和培训种类繁多&#xff0c;旨在帮助专业人士掌握业务流程管理 (BPM) 的知识和技能&#xff0c;从而提升个人职业发展和组织运营效率。下面分别介绍&#xff1a; 一、 业务流程认证和培训的种类 业务流程的认证和培训可以大致分为以下几类&#xff0c;涵盖了不…

vivado修改下载器下载速率

Error Launching Program X Error while launching program: fpga configuration failed. DONE PIN is not HIGH 原因是下载器速度太快了。先从任务管理器中关闭hw_server.exe试一下,要是不行就按下面三种方法解决。 第一种方法可以不用修改下载速度,直接先从vivado中将bit流…

巧妙实现右键菜单功能,提升用户操作体验

在动态交互式图库中&#xff0c;右键菜单是一项能够显著提升用户操作便捷性的功能。它的设计既要响应用户点击位置&#xff0c;又需确保菜单功能与数据操作紧密结合&#xff0c;比如删除图片操作。以下将通过一段实际代码实现&#xff0c;展示从思路到实现的详细过程。 实现右键…

CASS11快捷键设置

快捷键增加如下&#xff1a; tr----trim bo---(-boundary) ro---rotate ed----explode of---offset qs---qselect dp---ptype re---regen rec---rectang br---break dis---distuser do---draworder

HTTP 常见状态码技术解析(应用层)

引言 HTTP 状态码是服务器对客户端请求的标准化响应标识&#xff0c;属于应用层协议的核心机制。其采用三位数字编码&#xff0c;首位数字定义状态类别&#xff0c;后两位细化具体场景。 状态码不仅是服务端行为的声明&#xff0c;更是客户端处理响应的关键依据。本文将从协议规…

如何使用3D高斯分布进行环境建模

使用3D高斯分布来实现建模&#xff0c;主要是通过高斯分布的概率特性来描述空间中每个点的几何位置和不确定性。具体来说&#xff0c;3D高斯分布被用来表示点云数据中的每一个点或体素&#xff08;voxel&#xff09;的空间分布和不确定性&#xff0c;而不是单纯地存储每个点的坐…

兰州百合基因组(36.68 Gb)-文献精读113

The evolutionary tale of lilies: Giant genomes derived from transposon insertions and polyploidization 百合的进化故事&#xff1a;由转座子插入和多倍化导致的巨型基因组 百合&#xff08;Lilium spp.&#xff09;&#xff0c;被誉为“球根花卉之王”&#xff0c;因其…

如何做实用、好用的矿用电子围栏(续篇)

1 写在前面 去年写了一篇文章《如何做实用、好用的矿用电子围栏》&#xff0c;初步探讨了一下矿用UWB的电子围栏的实现方法&#xff0c;阅读量超出预期&#xff0c;说明电子围栏需求度比较高&#xff0c;企业对安全生产越来越重视。当时写这篇文章时&#xff0c;由于时间和理解…

【ThreeJS Basics 1-5】动画 Animations

文章目录 Three JS 中的动画window.requestAnimationFrame(fn)基本代码修改显示器刷新率的对比基础的动画尝试不同帧率导致动画速率不同解决方案一&#xff1a;DeltaTime解决方案2&#xff1a;Clock方法3&#xff1a; 动画库 Gsap如何选择方案&#xff1f; Three JS 中的动画 …