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只能为10

let 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 = true

let 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 = 0
    female = 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:string
    pivate _age:number

   get 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的超集

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Git Cherry-pick使用

概述 无论项目大小&#xff0c;当你和一群程序员一起工作时&#xff0c;处理多个 Git 分支之间的变更都会变得很困难。有时&#xff0c;与其把整个 Git 分支合并到另一个分支&#xff0c;不如选择并移动几个特定的提交。这个过程被称为 "挑拣", 即 Cherry-pick。 本…

使用QT纯代码创建(查找)对话框详细步骤与代码

一、创建项目文件 打开Qt Creator->文件->新建文件或项目->选择Qt Widgets Application 为项目起名字 输入类的名字 二、 了解每个文件的作用 项目创建完毕之后就会出现以下几个文件&#xff0c;先来分别介绍以下这些文件的作用。 Headers->finddialog.h——很显…

2023年国赛数学建模思路 - 复盘:校园消费行为分析

文章目录 0 赛题思路1 赛题背景2 分析目标3 数据说明4 数据预处理5 数据分析5.1 食堂就餐行为分析5.2 学生消费行为分析 建模资料 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 1 赛题背景 校园一卡通是集…

c语言每日一练(5)

前言&#xff1a;每日一练系列&#xff0c;每一期都包含5道选择题&#xff0c;2道编程题&#xff0c;博主会尽可能详细地进行讲解&#xff0c;令初学者也能听的清晰。每日一练系列会持续更新&#xff0c;暑假时三天之内必有一更&#xff0c;到了开学之后&#xff0c;将看学业情…

【三维编辑】Seal-3D:基于NeRF的交互式像素级编辑

文章目录 摘要一、引言二、方法2.1.基于nerf的编辑问题概述2.2.编辑指导生成2.3.即时预览的两阶段学生训练 三、实验四、代码总结 项目主页: https://windingwind.github.io/seal-3d/ 代码&#xff1a;https://github.com/windingwind/seal-3d/ 论文: https://arxiv.org/pdf/23…

k8s-----集群调度

目录 一&#xff1a;调度约束 二&#xff1a;Pod 启动创建过程 三&#xff1a;k8s调度过程 1、Predicate 有一系列的常见的算法 2、常见优先级选项 3、指定调度节点 &#xff08;1&#xff09;nodeName指定 &#xff08;2&#xff09;nodeSelector指定 四&#xff1a;亲和…

并发编程面试题2

并发编程面试题2 一、AQS高频问题&#xff1a; 1.1 AQS是什么&#xff1f; AQS就是一个抽象队列同步器&#xff0c;abstract queued sychronizer&#xff0c;本质就是一个抽象类。 AQS中有一个核心属性state&#xff0c;其次还有一个双向链表以及一个单项链表。 首先state…

Mac 卸载appium

安装了最新版的appium 2.0.1,使用中各种问题&#xff0c;卡顿....,最终决定回退的。记录下卸载的过程 1.打开终端应用程序 2.卸载全局安装的 Appium 运行以下命令以卸载全局安装的 Appium&#xff1a; npm uninstall -g appium 出现报错&#xff1a;Error: EACCES: permiss…

阿里云服务器带宽计费模式怎么选?有什么区别?

阿里云服务器公网带宽计费模式按固定带宽和按使用流量哪个划算&#xff1f;阿里云百科以北京地域为例&#xff0c;按固定带宽计费1M带宽一个月23元&#xff0c;按使用流量计费1GB流量0.8元&#xff0c;如果云服务器带宽使用率低于10%&#xff0c;那么首选按使用流量计费&#x…

stepin设置菜单icon的两种方式——基础积累

最近在看大佬写的stepin后台管理系统&#xff0c;框架是vue3antd3.xvite&#xff0c;下面记录一下&#xff0c;菜单图标的使用方法。 1.第一种方法就是使用antd中的icon图标 书写方式如下&#xff1a; {path: /,name: 首页,redirect: /analysis,meta: {title: 首页,renderMen…

Untiy Json和Xml的序列化和反序列化

Json的序列化和反序列化 1.定义数据类 [Serializable] public class ZoomPoint {// 点名称, 将作为Key被字典存储public string name;// 轴心X坐标public Vector2 pivot Vector2.one / 2;// 放大倍率&#xff0c;小于1是为缩小倍率&#xff0c;小于0是取绝对值&#xff0c;不…

redis学习笔记(九)

文章目录 python对redis基本操作&#xff08;1&#xff09;连接redis&#xff08;2&#xff09;数据类型操作 python对redis基本操作 &#xff08;1&#xff09;连接redis # 方式1 import redisr redis.Redis(host127.0.0.1, port6379) r.set(foo, Bar) print(r.get(foo))# …

【MOOC】北京理工大学Python网络爬虫与信息提取慕课答案-综合挑出了一些很难评的慕课测验题

1 Requests库中的get()方法最常用&#xff0c;下面哪个说法正确&#xff1f;‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬…

mysql 技术总结

一、mysql 索引&#xff08;左小右大&#xff09; 下图中为二叉树 mysql索引类型以及数据结构 BTREE结构 BTree又叫多路平衡搜索树&#xff0c;一颗m叉的BTree特性如下&#xff1a; 树中每个节点最多包含m个孩子。 除根节点与叶子节点外&#xff0c;每个节点至少有[ceil(m/2…

【LeetCode每日一题】——575.分糖果

文章目录 一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【题目提示】七【解题思路】八【时间频度】九【代码实现】十【提交结果】 一【题目类别】 哈希表 二【题目难度】 简单 三【题目编号】 575.分糖果 四【题目描述】 Alice 有 n 枚糖&…

Qt5开发视频播放器

一、播放器界面UI设计 控件对象名位置&#xff08;坐标点&#xff09;对象名称组件名称备注Widget(0, 0, 809, 572)WidgetQWidgetlabellabelQLabel播放窗口label_2label_2QLabelvoice_controlvoice_controlQSlider音量滑动条btn_openbtn_openQPushButton打开文件按钮label_4la…

uniapp软键盘谈起遮住输入框和头部被顶起的问题解决

推荐&#xff1a; pages.json中配置如下可解决头部被顶起和表单被遮住的问题。 { "path": "pages/debug/protocol/tagWord", "style": { "app-plus": { "soft…

JAVA多线程和并发基础面试问答(翻译)

JAVA多线程和并发基础面试问答(翻译) java多线程面试问题 1. 进程和线程之间有什么不同&#xff1f; 一个进程是一个独立(self contained)的运行环境&#xff0c;它可以被看作一个程序或者一个应用。而线程是在进程中执行的一个任务。Java运行环境是一个包含了不同的类和程序…

web基础和tomcat的安装,部署jpress应用

目录 1. 简述静态网页和动态网页的区别。 2. 简述 Webl.0 和 Web2.0 的区别。 3. 安装tomcat8&#xff0c;配置服务启动脚本&#xff0c;部署jpress应用。 1. 简述静态网页和动态网页的区别。 【1】定义区别 请求响应信息&#xff0c;发给客户端进行处理&#xff0c;由浏览…

snapshotter not loaded: overlayfs: invalid argument

测试containerd是否能创建和启动成功 执行如下命令拉取镜像并创建容器&#xff1a; 拉取容器 ctr i pull docker.io/library/nginx:alpine 创建容器 ctr c create --net-host docker.io/library/nginx:alpine nginx ctr task start -d nginx查看Containerd服务启动信息&…