文章目录
安装和环境搭建
基本类型
tsconfig.ts 文件配置选项
类
使用webpack打包ts
例子(贪吃蛇小游戏)
前言
主要做一些学习笔记,查缺补漏
TypeScript是JavaScript的超集,具有可选的类型并可以编译为纯JavaScript。从技术上讲TypeScript就是具有静态类型的 JavaScript 。
提示:以下是本篇文章正文内容,下面案例可供参考
安装和环境搭建
全局安装:
npm install -g typescript
编译:
tsc hello.ts
运行后会生成一个hello.js文件,然后可以通过node启动这个js文件。
自动编译:
tsc hello.ts -w
所有文件编译:
必须添加配置文件:tsconfig.json,然后执行命令(默认是所有文件编译):
tsc
基本类型
类型 | 例子 | 描述 |
number | 1,-33,2.5 | 任意数字 |
string | 'hi',"hi" | 任意字符串 |
boolean | true,false | 布尔值 |
字面量 | 其本身 | 限制变量的值就是该字面量的值 |
any | * | 任意类型 |
unknown | * | 类型安全的any |
void | 空值(undefined) | 没有值(或undefined) |
never | 没有值 | 不能是任何值 |
object | {name:'小明'} | 任意的JS对象 |
array | [1,2,3] | 任意JS数组 |
tuple | [4,5] | 元素,TS新增类型,固定长度数组 |
enum | enum{A,B} | 枚举,TS中新增类型 |
// 字符串
let a: string = '1231';
// 字面量,或者是male | 或者是feamle(联合类型)
let b: "male" | "female";
let c: boolean | string;
// any 表示任意类型,设置any后相当于关闭了TS的类型检测(不建议)
// 声明变量如果不指定类型,默认any,隐式any
let d: any;
d = 10;
d = 'hello';
// 未知类型的值
let e: unknown;
// 类型断言,告诉解析器变量的实际类型
e = a as string;
e = <string>a;
// void 表示空,以函数为例子,表示没有返回值(可以返回undefined、null)
function fn(): void{}
// never 表示永远不返回结果
function fn2(): void{
throw new Error('报错了');
}
// 对象
let f: object;
// g 是一个对象,可以包含哪些属性。里面有个name属性,其值是字符串类型。age属性是可选的。
let g: {name: string, age?: number};
// [proName: string]: any 表示任意类型的属性
let h: {name: string, [propName: string]: any};
// 设置函数结构类型声明
let i: (a: number, b: number)=>number;
i = function(n1, n2): number{
return n1 + n2;
}
// 字符串数组
let j: string[];
j = ['a', 'b']
let k: Array<number>; // 数字类型数组
// 元组 就是固定长度的数组
let l: [string, string];
// enum 枚举
enum Gender {
Male,
Female
}
let m: {name: string, gender: Gender}
m = {name:'sdf',gender:Gender.Male}
// & 同时
let n: {name: string} & {age: number}
n = {name: '小明', age: 18}
// 类型别名 简化类型使用
type myType = 1| 2| 3| 4;
let o: myType;
tsconfig.ts 文件配置选项
{
/*
tsconfig.json 是ts编译器的配置文件,可以根据它的信息来对代码进行编译
*/
/*
哪些ts文件需要被编译
路径:
** 表示任意目录
* 表示任意文件
*/
"include": [
"./**/*"
],
// 不需要被编译的文件目录
"exclude": [],
// 定义被继承的配置文件 比如有xx.json,直接引入到这个tsconfig.js
// "extends": "",
// 指定被编译文件的列表,常用于文件少时
// "files": [],
// 编译器选项
"compilerOptions": {
// 用来指定ts被编译为es的版本 'es3', 'es5', 'es6', 'es2015', 'es2016', 'es2017', 'es2018', 'es2019', 'es2020', 'es2021', 'esnext'
"target": "es6",
// 指定要使用模块化的规范 'none', 'commonjs', 'amd', 'system', 'umd', 'es6', 'es2015', 'es2020', 'es2022', 'esnext', 'node12', 'nodenext'
"module": "system",
// 用来指定项目中要使用的库
//'es5', 'es6', 'es2015', 'es7', 'es2016', 'es2017', 'es2018', 'es2019', 'es2020', 'es2021', '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', 'es2020.bigint', 'es2020.promise', 'es2020.sharedmemory', 'es2020.string', 'es2020.symbol.wellknown', 'es2020.intl', 'es2021.promise', 'es2021.string', 'es2021.weakref', 'es2021.intl', 'esnext.array', 'esnext.symbol', 'esnext.asynciterable', 'esnext.intl', 'esnext.bigint', 'esnext.string', 'esnext.promise', 'esnext.weakref'
// "lib": ["dom"],
// 编译后文件所在的目录
"outDir": "./dist",
// 将代码合并成一个文件,所有全局作用域中的代码合并到同一个文件(一般通过打包工具,很少使用)
// "outFile": "./dist/app.js",
// 是否对js文件进行编译,默认false
"allowJs": false,
// 是否检查js代码是否符合语法规范
"checkJs": false,
// 是否移除注释
"removeComments": false,
// 不生成编译后的js文件
"noEmit": false,
// 当有错误时不生成编译后文件
"noEmitOnError": false,
// 所有严格检查的总开关
"strict": false,
// 是否启动严格模式
"alwaysStrict": false,
// 允许隐式any
"noImplicitAny": false,
// 允许不明确类型的this
"noImplicitThis": false,
// 不严格的检查空值
"strictNullChecks": false,
}
}
类
// 以abstract开头为抽象类,不能用来创建对象,专门用来被继承
abstract class Animal {
// 实例只读属性
readonly name: string = '小明';
// 静态只读属性
static readonly age: number = 18;
weight:string;
constructor(weight: string) {
this.weight = weight;
}
sayHello() {
console.log('say');
}
// 抽象方法,子类必须对抽象方法进行重写
abstract say():void;
}
class Dog extends Animal {
constructor(weight:string) {
super(weight);
}
say() {
console.log('aaaaaaa');
}
}
// 接口用来定义一个类结构,用来定义一个类应该包含哪些属性和方法。
interface myInterface {
name: string,
age: number;
sayHello():void
}
interface myInterface {
gender: string,
}
const obj: myInterface = {
name: 'aaa',
age: 123,
gender: '男',
sayHello() {}
}
class MyClass implements myInterface {
name: string;
age: number;
gender: string;
constructor(name: string, age: number, gender: string) {
this.name = name;
this.age = age;
this.gender = gender;
}
sayHello() {}
}
// 属性封装
class A {
// pubilc 默认的
// private 私有属性,只能类内部进行访问(修改)。不被继承
private _name: string;
// protected 受包含的属性,只能在当前类和当前累的子类中使用。能被继承
protected num: number;
constructor(name: string, num: number) {
this._name = name;
this.num = num;
}
getName() {
return this._name;
}
}
class B {
// 直接将属性定义在构造函数
constructor(public name: string, private age: number){}
}
// 泛型 在定义函数或类时,如果遇到类型不明确的时候使用泛型。
function fn<T>(a: T): T{
return a;
}
fn(10);// 不指定泛型,ts可以自动对类型进行推断
fn<string>('hello'); // 指定泛型
function fn2<T, K>(a: T, b: K):T{
console.log(b);
return a;
}
fn2(111,'hello');
fn2<number,string>(111,'12312');
interface Inter {
length: number;
}
// T extends Inter 表示泛型T必须是Inter实现类(子类)
function fn3<T extends Inter>(a: T):number{
return a.length;
}
fn3({length: 10});
class MyClass2<T> {
name: T;
constructor(name: T) {
this.name = name;
}
}
new MyClass2<string>('孙文斌');
使用webpack打包ts
>新开一个项目
初始化(生成package.json文件):
npm init
安装依赖:
npm i -D webpack webpack-cli typescript ts-loader
生成html文件,并自动引入在内存中打包好的bundle.js文件
npm i -D html-webpack-plugin
一个小型的静态文件服务器。使用它,可以为webpack打包生成的资源文件提供Web服务
npm i -D webpack-dev-server
webpack打包后的dist目录中的所有文件将被删除一次
npm i -D clean-webpack-plugin
解决浏览器兼容性
npm i -D @babel/core @babel/preset-env babel-loader core-js
配置文件:webpack.config.js
// 引入一个包
const path = require('path');
// 引入html插件(生成对应的html文件)
const HTMLWebpackPlugin = require("html-webpack-plugin");
// 引入clean插件
const { CleanWebpackPlugin } = require("clean-webpack-plugin");
// webpack 中的所有配置信息都应该写在module.exports中
module.exports = {
// 指定入口文件
entry:"./src/index.ts",
//指定打包文件所在目录
output:{
//指定打包后的目录
path: path.resolve(__dirname, 'dist'),
// 打包后文件的文件
filename: "bundle.js",
// 告诉webpack不使用箭头函数
environment:{
arrowFunction:false
}
},
// 指定webpack打包时要使用模块
module:{
// 指定要加载的规则
rules: [
{
// 使用ts-loader去处理符合 /\.ts$/ 规则的文件
// test指定的是规则生效的文件
test: /\.ts$/,
// 要使用的loader.(顺序从后往前执行)
use: [
// 配置babel
{
// 指定加载器
loader: "babel-loader",
// 设置babel
options:{
// 设置预定义的环境
presets: [
[
// 指定环境插件
"@babel/preset-env",
// 配置信息
{
targets: {
// 要兼容的目标浏览器
"chrome": "88",
"ie": "11",
},
// 下面两个参数意义:比如Promise,在ie里没有该方法,会从corejs引入自己版本实现的Promise功能。
// 指定corejs的版本
"corejs": "3",
// 使用corejs的方式 "usage"表示按需加载
"useBuiltIns": "usage"
}
]
]
}
},
'ts-loader'
],
// 要排除的文件
exclude: /node-modules/
}
],
},
// 配置webpack插件
plugins: [
new HTMLWebpackPlugin({
// title: '这是一个自定义的title',
template: "./src/index.html"
}),
new CleanWebpackPlugin()
],
// 设置引用模块
resolve: {
// 凡是以ts、js的文件都可以用于模块(可以使用import、export)
extensions: ['.ts','.js']
},
mode: 'production' // 设置mode
}
配置文件:tsconfig.json
{
"compilerOptions": {
"target": "ES2015",
"module": "ES2015",
"strict": true
}
}
配置文件:package.json
添加一个build命令
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"build": "webpack --mode production",
"start": "webpack serve"
},