TypeScript 语法

环境搭建

以javascript为基础构建的语言,一个js的超集,可以在任何支持js的平台中执行,ts扩展了js并且添加了类型,但是ts不能被js解析器直接执行,需要编译器编译为js文件,然后引入到 html 页面使用。

ts增加了数据类型,支持es的新特性,添加了es不具备的新特性,丰富的配置选项,还有强大的开发工具。

全局安装ts(需要node环境), 安装后 tsc 指令可以查看是否安装成功

npm i -g typescript

tsc xxx.ts  //编译ts文件为js

 基本类型

需要类型声明,指定ts中变量的类型,指定类型后,当变量赋值时,ts会自动检查值是否符合声明的类型,否则就报错。如果变量的声明和赋值是同时进行的,ts可以自动对变量进行类型检测;除了声明变量,也可添加类型给函数参数,对于返回的结果也可以设置类型。

let a = true //如果变量的声明和赋值是同时进行的,ts可以自动对变量进行类型检测。let b:number;function sum(a:number,b:number):number{return a+b;
}
类型例子描述
number1,-33,2.5任意数字
string'hi'任意字符串
booleantrue/false布尔值
字面量其本身 (let a:10,a的值只能是10,很少这么用)限制变量的值就是该字面量的值
any*任意类型(相当于关闭了类型检测)
unknown*类型安全的any
void空值(undefined)没有值(或undefined)
never没有值不能是任何值
object{name:'张三'}任意的js对象
array[1,2,3]任意js数组
tuple[4,5,'123']元祖,ts新增类型,固定长度数组
enumenum{A,B}枚举,ts新增类型

number类型

let a:number = 6

string类型

let str:string = "hello!"

boolean类型

let str:boolean = true

字面量 类型

let a:10
a = 10 //a只能为10let b:'male'|'female' //b只能是 'male' 或者 'female'(联合类型) 其他值会报错
b = 'male'
b = 'female'let c:boolean|string //c可以是布尔类型或者字符串类型
c = true
c = 'hello'

any类型

可以是任意类型,相当于对该变量关闭了ts类型检测,不设置指定类型,默认为any类型,但是any类型的值可以赋值给任意变量,不报错,会影响其他变量类型。少用,一般多用unknown

let d:any; //可以是任意类型,相当于对该变量关闭了ts类型检测
d = 'hello'
d = 123
d = truelet e; //不设置指定类型,默认为any类型

unknown类型

未知类型,用法与any一致,但是不同的类型依旧不可以赋值。实际上就是一个安全类型的any,不能直接赋值给其他,可以采用类型断言的方式赋值。告诉解析器变量的实际类型。

let e:unknown;
e = 'hello'let s:string 
s = e //此时报错,因为e不是string类型//类型断言,两种方式都可以
s = e as string 
s = <string>e

void类型

主要用于函数的无返回值,表示函数无返回值

function fn():void{}

never类型

表示永远不会返回结果,比如调用下方的方法就会报错,代码执行立即结束,则没有返回值了

function fn():never{throw new Error('报错了')
}

 objec类型

比较鸡肋,万物皆是对象,可以是 {} ,可以是 function,也可以是[ ] 。

let a:object;
a = {}
a = function (){}//b是对象类型,并且要有一个name属性,age属性可有可无,再添加属性就会报错
let b:{name:string,age?:number};//任意字符串的属性名,对应的值为any任意类型,可以写多个属性,但是一定要有name属性
let c = {name:string,[propName:string]:any}
c = {name:'hello'age:18,gender:'男'}let d:(a:number,b:number)=>number //
d = function (a:number,b:number):number{return a + b
}

Array类型

let e:string[]; //表示字符串数组
e = ['a','b']let f:number[]; //数字数组,let g:Array<number>; // 数字数组,与上方的意义相同
g = [1,2,3,4]

元组类型

固定长度的数组,严格需要个数一致。

let h:[string,number]
h = ['abe',123]

enum 枚举

enum Gender{male = 0female = 1
}
let i:{name:string,gender:Gender }
i = {name:'hello',gender:Gender.male
}

& 表示同时

let j:{name:string} & {age:number};
j = {name:'hello',age:18
}

类型别名

type  myType = 1|2|3
let m:myType //起了别名

编译选项

自动编译文件

使用-w指令,ts会监听文件变化,并在变化时对文件重新编译。

tsc xxx.ts -w

自动编译整个项目

 需要配置tsconfig.json文件,添加配置文件后,执行 tsc 指令,可以完成对整个项目的编译

tsc -w 指令监听并编译整个项目文件 可以直接使用命令行来初始化配置文件

tsc -init

配置选项

include

用来指定哪些ts文件需要被编译

{"include":["./src/**/*" //src文件夹下所有文件 **表示任意目录,*表示任意文件]
}
exclude

用来指定哪些ts文件不需要被编译,默认值:["node_modules",'browser_components','jspm_packages'],也可以不配置。

{"exclude": ["./src/hello/**/*"],
}
extends

定义被继承的配置文件,另一个配置文件的配置选项和 tsconfig.json 一致。

{"extends":"./config.json",
}
files

指定被编译文件的列表,只有需要变异的文件少时才会用到。类似于include,这个仅限于文件。

{"files": ["./src/01.ts"]
}

compilerOptions 编译选项

target

指定ts被编译为ES的版本,默认是 ES3

//可取值为:'es3', 'es5','es6', 'es2015','es2016','es2017', 'es2018','es2019','es2020','es2021',‘es2022','esnext'
{"compilerOptions": {"target":"ES3"}
}
module

指定要使用的模块化的规范

//取值 'none', 'commonjs', 'amd', 'system', 'umd', 'es6', 'es2015', 'es2020', 'es2022', 'esnext', 'node16', 'nodenext'{"compilerOptions": {"module": "es6"}
}
lib

用来指定项目中要使用的第三方的库,是一个数组,但是一般情况下我们不会去改。

//可取值 'es5', 'es6', 'es2015', 'es7', 'es2016', 'es2017', 'es2018', 'es2019', 'es2020', 'es2021', 'es2022', 'es2023', 'esnext', 'dom', 'dom.iterable', 'webworker', 'webworker.importscripts', 'webworker.iterable', 'scripthost', 'es2015.core', 'es2015.collection', 'es2015.generator', 'es2015.iterable', 'es2015.promise', 'es2015.proxy', 'es2015.reflect', 'es2015.symbol', 'es2015.symbol.wellknown', 'es2016.array.include', 'es2017.object', 'es2017.sharedmemory', 'es2017.string', 'es2017.intl', 'es2017.typedarrays', 'es2018.asyncgenerator', 'es2018.asynciterable', 'es2018.intl', 'es2018.promise', 'es2018.regexp', 'es2019.array', 'es2019.object', 'es2019.string', 'es2019.symbol', 'es2019.intl', 'es2020.bigint', 'es2020.date', 'es2020.promise', 'es2020.sharedmemory', 'es2020.string', 'es2020.symbol.wellknown', 'es2020.intl', 'es2020.number', 'es2021.promise', 'es2021.string', 'es2021.weakref', 'es2021.intl', 'es2022.array', 'es2022.error', 'es2022.intl', 'es2022.object', 'es2022.sharedmemory', 'es2022.string', 'es2022.regexp', 'es2023.array', 'esnext.array', 'esnext.symbol', 'esnext.asynciterable', 'esnext.intl', 'esnext.bigint', 'esnext.string', 'esnext.promise', 'esnext.weakref', 'decorators', 'decorators.legacy'{"compilerOptions": {// "lib": ["es6"]}
}
outDir

指定编译后的文件所在的路径,默认编译是和原ts文件在同一目录下。

{"compilerOptions": {"outDir": "./dist"}
}
outFile

指定将ts代码编译后合并为一个js文件(默认合并的是全局作用域中的代码),如果涉及到模块化(export / import)会报错,需要更改 module 为 amd 或者是 system,一般不常用。

{"compilerOptions": {"outFile": "./dist/app.js"}
}
allowJs

是否对js文件进行编译,默认是false

{"compilerOptions": {"allowJs": false}
}
checkJs

检查js代码是否符合语法规范,默认是false

{"compilerOptions": {"checkJs": false}
}
 removeComments

是否移除编译后js中的注释。

{"compilerOptions": {"removeComments": true}
}
 noEmit

是否生成编译后的文件,默认为false

{"compilerOptions": {"noEmit": false,}
}
noEmitOnError

当有错误的时候,不生成编译文件,默认为false

{"compilerOptions": {"noEmitOnError": false,}
}
 alwaysStrict

设置编译后的文件是否使用严格模式,默认为false

{"compilerOptions": {"alwaysStrict": false,}
}
 noImplicitAny

不允许 ts 中隐式 any 的类型出现,比如忘记给函数形参指定数据类型

{"compilerOptions": {"alwaysStrict": true,}
}
 noImplicitThis

不允许不明确类型的 this,默认值false

{"compilerOptions": {"noImplicitThis": true,}
}
 strictNullChecks

严格检查空值 null 并且报错,默认值为false

{"compilerOptions": {"strictNullChecks": true,}
}

 其余配置选项参考:tsconfig.json · TypeScript中文网 · TypeScript——JavaScript的超集

 


使用webpack来配置ts的打包编译

npm init
npm i -D webpack webpack-cli typescript ts-loader html-webpack-plugin clean-webpack-plugin webpack-dev-server

webpack.config.js

const path = require('path')
const HTMLWebpackPlugin = require("html-webpack-plugin")
const { CleanWebpackPlugin } = require("clean-webpack-plugin")
module.exports = {//指定入口文件entry: "./src/index.ts",//指定打包文件的所在目录output: {//指定打包文件目录path: path.resolve(__dirname, 'dist'),//打包后文件名称filename: "bunndle.js",clean: true,environment:{arrowFunction:false}},module: {rules: [//指定ts文件的loader{test: /\.ts$/,use: [{loader: "babel-loader",options: {presets: [["@babel/preset-env", {targets: { "chrome": "88","ie":"11"},"corejs": "3","useBuiltIns": "usage"}]]}},],//要排除的文件exclude: /node-modules/}]},plugins: [new HTMLWebpackPlugin({template: "./public/index.html"}),new CleanWebpackPlugin()],resolve: {extensions: [".ts", ".js"]},mode: "production"
}
//tsconfig.json{"compilerOptions":{"module": "es2015","target": "es2015","strict": true}
}
//package.json"scripts": {"test": "echo \"Error: no test specified\" && exit 1","build": "webpack","start": "webpack serve --open chrome.exe "},

Class类的一点总结

super函数调用:当子类继承父类后,有了自己的构造函数,那么相当于父类的构造函数被重写,那么将不会调用父类的构造函数会报错,此时需要调用super函数来执行父类的构造函数。

abstact类:当一个类只用于继承时,那么使用抽象类,且不能用来创建对象,抽象父类的公共方法,需要子类必须重写抽象方法,不用写函数体,抽象方法只能写在抽象类中。

abstract class Parent{abstract test():void;
}class Child extends Parent{constructor(){super()}test(){console.log('test')}}

接口interface

用来定义一个类的结构,应该包含哪些属性和方法,同时也可以当做是类型声明,但是接口可以重复定义,最终是将相同接口的内容合并在一起。

接口可以在定义类的时候去限制类的结构,接口内的所有属性不能有实际的值,方法也是抽象方法,可以看做是一个抽象类,通过  implements 进行实现。

interface myInterface{name:string;age:number;test():void;
}const obj:myInterface = {name:'sss',age:111}class Test implements myInterface{name:string,construcror(name:string){this.name = name}test(){}
}

属性修饰符

public:修饰的属性可以在任意位置访问修改。

private:私有属性,只能在类内部修改,如果要修改private属性可以添加 getter setter 的方法,外部可以直接通过 . 的方式进行访问和修改属性。

class Test implements myInterface{private _name:stringpivate _age:numberget name(){return this._name}set name(value){this._name = value}
}let test = new Test()
let name = test.name

protected:受保护的属性,只能在当前的类和子类中(内部)访问,外部不能访问。

泛型

在定义函数或类时,如果遇到类型不明确就可以使用泛型,泛型可以同时指定多个,

function fn<T>(a:T):T{return a
}
let a = fn(10) //不指定类型,ts会自动对类型进行推断,此时T为number
let str = fn<string> ('hello') // 指定泛型function fn2<T,K>(a:T,b:K):T{return a
}
let num = fn2<number,string>(123,'hello')interface Inter{length:number
}
function fn3<T extends Inter>(a:T):number{ //继承Inter接口,是Inter的子类return a.length
}
fne({length:10})class MyClass<T>{name:T;constructor(name:T){this.name = name}
}
const mc = new MyClass<string>('jerry')

其他参考文档:文档简介 · TypeScript中文网 · TypeScript——JavaScript的超集

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/92898.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Blender增强现实3D模型制作指南【AR】

推荐&#xff1a;用 NSDT编辑器 快速搭建可编程3D场景 将静态和动画 3D 内容集成到移动增强现实 (AR) 体验中是增强用户沉浸感和参与度的高效方法。 然而&#xff0c;为 AR 创建 3D 对象可能相当艰巨&#xff0c;尤其是对于那些缺乏 3D 建模经验的人来说。 与添加视频或照片 AR…

Mariadb高可用MHA (四十二)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 前言 一、概述 1.1 概念 1.2 组成 1.3 特点 1.4 工作原理 二、构建MHA 2.1 ssh免密登录 2.2 主从复制 2.3 MHA安装 2.3.1所有节点安装perl环境 2.3..2 node 2.3.…

零售行业供应链管理核心KPI指标(三)

完美订单满足率和退货率 完美订单满足率有三个方面的因素影响&#xff1a;订单按时、足量、无损交货。通常情况下零售企业追求线上订单履行周期慢慢达到行业平均水平&#xff0c;就是交付的速度变快了&#xff0c;这个肯定是一件好事情&#xff0c;趋势越来越好。 同时&#…

Vim的插件管理器之Vundle

1、安装Vundle插件管理器 Vim可以安装插件&#xff0c;但是需要手动安装比较麻烦&#xff0c;Vim本身没有提供插件管理器&#xff0c;所以会有很多的第三方的插件管理器&#xff0c;有一个vim的插件叫做 “vim-easymotion”&#xff0c;在它的github的安装说明里有列出对于不同…

log4j:WARN No appenders could be found for logger问题

本文将idea场景下的使用。 IDEA中&#xff0c;将配置文件命名为log4j.properties&#xff08;该命名才会被自动加载&#xff09;&#xff0c; 并放到某个目录下&#xff08;通常放到resources目录&#xff09;&#xff0c;并在resources上右键&#xff0c;找到Mark Directory a…

Nginx转发请求到后端服务报400 Bad Request

问题描述 系统部署好后&#xff0c;进行测试时发现有部分接口出错&#xff0c;项目采用Nginx作为后端代理服务器&#xff0c;有Nginx统一将请求转发到后端的网关服务&#xff0c;再由网关服务路由到具体的服务上&#xff0c;发布好后&#xff0c;大部分接口都是正常的&#xff…

POSTGRESQL 关于2023-08-14 数据库自动启动文章中使用KILL 来进行配置RELOAD的问题解释...

开头还是介绍一下群&#xff0c;如果感兴趣Polardb ,mongodb ,MySQL ,Postgresql ,redis &#xff0c;SQL SERVER ,ORACLE,Oceanbase 等有问题&#xff0c;有需求都可以加群群内有各大数据库行业大咖&#xff0c;CTO&#xff0c;可以解决你的问题。加群请加 liuaustin3微信号 &…

常见排序集锦-C语言实现数据结构

目录 排序的概念 常见排序集锦 1.直接插入排序 2.希尔排序 3.选择排序 4.堆排序 5.冒泡排序 6.快速排序 hoare 挖坑法 前后指针法 非递归 7.归并排序 非递归 排序实现接口 算法复杂度与稳定性分析 排序的概念 排序 &#xff1a;所谓排序&#xff0c;就是使一串记录&#…

【计算机网络】13、ARP 包:广播自己的 mac 地址和 ip

机器启动时&#xff0c;会向外广播自己的 mac 地址和 ip 地址&#xff0c;这个即称为 arp 协议。范围是未经过路由器的部分&#xff0c;如下图的蓝色部分&#xff0c;范围内的设备都会在本地记录 mac 和 ip 的绑定信息&#xff0c;若有重复则覆盖更新&#xff08;例如先收到 ma…

ESP32+VSCode开发环境搭建(全网最强最终解决方案)

文章目录 1 安装步骤2 开发机器环境准备3 安装ESP-IDF-tools离线包4 创建VSCode配置文件(纯净的开发环境)5 安装espressif IDF 插件6 程序测试7 常见问题7.1环境变量设置问题&#xff1f;问题1&#xff1a;到底是设置IDF_TOOLS_PATH和IDF_PATH还是只配置一个IDF_TOOLS_PATH? 7…

Spring的简介ioc容器及注入方式

一.Spring的简介 1.Spring的特性 Spring是一个开源框架&#xff0c;它由Rod Johnson创建。它是为了解决企业应用开发的复杂性而创建的。 Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。 然而&#xff0c;Spring的用途不仅限于服务器端的开发。从简单性、可测试性…

Python文件操作与输入输出:从基础到高级应用

文章目录 &#x1f340;引言&#x1f340;文件操作基础&#x1f340;上下文管理器与文件自动关闭&#x1f340;文件的迭代与逐行读取&#x1f340;文件的其他常见操作&#x1f340;输入输出基础&#x1f340; 文件输入输出&#x1f340;格式化输出&#x1f340;高级文件操作&am…

(二)掌握最基本的Linux服务器用法——Linux下简单的C/C++ 程序、项目编译

1、静态库与动态库 静态库(Static Library)&#xff1a;静态库是编译后的库文件&#xff0c;其中的代码在编译时被链接到程序中&#xff0c;因此它会与程序一起形成一个独立的可执行文件。每个使用静态库的程序都会有自己的库的副本&#xff0c;这可能会导致内存浪费。常用后缀…

AI 绘画Stable Diffusion 研究(九)sd图生图功能详解-老照片高清修复放大

大家好&#xff0c;我是风雨无阻。 通过前面几篇文章的介绍&#xff0c;相信各位小伙伴&#xff0c;对 Stable Diffusion 这款强大的AI 绘图系统有了全新的认知。我们见识到了借助 Stable Diffusion的文生图功能&#xff0c;利用简单的几个单词&#xff0c;就可以生成完美的图片…

7-3 求给定精度的简单交错序列部分和

分数 15 全屏浏览题目 切换布局 作者 C课程组 单位 浙江大学 本题要求编写程序&#xff0c;计算序列部分和 1 - 1/4 1/7 - 1/10 ... 直到最后一项的绝对值不大于给定精度eps。 输入格式: 输入在一行中给出一个正实数eps。 输出格式: 在一行中按照“sum S”的格式输出…

.net连接mysql,提示找不到请求的 .Net Framework Data Provider。可能没有安装

开发完成的.net程序需要连接mysql数据库&#xff0c;在个人电脑上运行没问题&#xff0c;别人运行时提示“提示找不到请求的 .Net Framework Data Provider。可能没有安装”。经过查询&#xff0c;安装Connector/NET 8.1.0&#xff0c;下载地址如下所示&#xff1a; https://d…

(分治) 剑指 Offer 16. 数值的整数次方 ——【Leetcode每日一题】

❓剑指 Offer 16. 数值的整数次方 难度&#xff1a;中等 实现 pow(x, n) &#xff0c;即计算 x 的 n 次幂函数&#xff08;即&#xff0c; x n x^n xn&#xff09;。不得使用库函数&#xff0c;同时不需要考虑大数问题。 示例 1&#xff1a; 输入&#xff1a;x 2.00000, n …

腾讯云轻量服务器测评:2核 2G 4M

腾讯云轻量2核2G4M服务器&#xff0c;4M带宽下载速度可达512KB/秒&#xff0c;系统盘为50GB SSD盘&#xff0c;300GB月流量&#xff0c;地域节点可选上海、广州和北京&#xff0c;腾讯云百科分享腾讯云2核2G4M轻量应用服务器配置性能表&#xff1a; 目录 腾讯云轻量2核2G4M服…

谈谈网络协议的定义、组成和重要性

个人主页&#xff1a;insist--个人主页​​​​​​ 本文专栏&#xff1a;网络基础——带你走进网络世界 本专栏会持续更新网络基础知识&#xff0c;希望大家多多支持&#xff0c;让我们一起探索这个神奇而广阔的网络世界。 目录 一、网络协议的定义 二、网络协议的组成 1、…

Vite更新依赖缓存失败,强制更新依赖缓存

使用vitets开发一段时间了&#xff0c;感觉并不是想象中的好用&#xff0c;特别是出现些稀奇古怪的问题不好解决&#xff0c;比如下面这个问题 上午9:50:08 [vite] error while updating dependencies: Error: ENOENT: no such file or directory, open E:/workspace-dir/node…