1.搭建环境
2.选择一个自己喜欢的编程软件
我学习的时候,选择的是vscode,免费、轻便、好用。
3.基本类型
typescript,就是在js的基础之上,对变量进行类型的控制。
// 声明一个变量,指定它的类型为string(先声明在赋值)
let b: string;
b = "11111";
//赋值和声明同时进行的话,可以省略:string
let b='1111'
(ts编译器会自动检测变量类型)
类型:
3.1字面量进行类型声明
// 字面量进行类型声明
let a:10;
a=10;//这里只能设置a的值为10
//联合类型
let d:'xiaotang' | 'xiaoliu';(这里d的值只可以是两个字符串中的一个)
// 任意类型
let tang:any;
tang=1;
tang='11'
tang=true
(相当于关闭了ts语法检测)
// unknown 相当于一个安全的any类型
/**
* 类型断言
* 变量 as 类型
* <类型> 变量
*/
let s:unknown;
let e:string;
s='hello'
// e=s 报错,不能将unknown赋值给string
if (typeof s==='string'){
e=s //不会报错
}
//上面的if语句相当于下面
e=s as string;
e=<string>s;
// 函数类型
/**
*
* @param num1 数值后面指定的时参数类型
* @param num2
* @returns 阔号后面指定的时返回值类型
*/
function add(num1: number, num2: number): number {
return num1 + num2;
}
console.log(add(1,3))
//函数表达式
const sub=(num1:number,num2:number):number=>{
return num1-num2
}
console.log(sub(10,7))
//函数表达式二
type subplug =(num1:number,num2:number)=>number
const sort:subplug=(num1,num2)=>{
return num1*num2
}
//函数无返回值
function fedback(name:string):void{
console.log(name)
}
/**
* void代表返回值可以为空
* @param start 后面的问号代表可选参数
* @param end 可选参数在必选参数后面
*/
function myslice(start:number,end?:number):void{
console.log('开始索引:'+start,'结束索引:'+end)
}
myslice(1)
myslice(2,3)
枚举(新添加的属性)
3.2.别名
4.编译选项
在项目目录中,添加tsconfig.json文件,可以进行tsc命令,一键编译所有ts文件
更多配置详情----》https://blog.csdn.net/HanYaLi39/article/details/130054192
5.使用webpack打包代码
1.初始化项目包
npm init -y 生成pack.json文件,进行项目的管理
2.下载包,进行开发依赖的下载
pnpm i -D webpack webpack-cli typescript ts-loader
3.编辑webpack配置文件(webpack.config.js)
// 导入一个路径包
const path = require("path")
// webpack中所有的配置信息都写在module.exports中
module.exports = {
// 指定入口文件
entry: "./src/index.ts",
// 指定打包文件所在目录
output: {
// 指定打包文件的目录
path: path.resolve(__dirname, "dist"),
// 打包后的文件名
filename: "bundle.js",
},
// 设置mode
mode: 'development' ,
// 指定webpack打包时要使用的模块
module: {
// 指定加载规则
rules: [
{
// test指定的是规则生效的文件
test: /\.ts$/,
// 要使用的loader
use:'ts-loader',
// 要排除的文件
exclude:/node_modules/
},
],
},
}
4.tsconfig.json配置
{
"compilerOptions": {
"module": "CommonJS",
"target": "ES5",
"strict": true
}
}
命令别名
执行命令
效果:
6.引入各种插件,进行webpack的优化
6.1 html-webpack-plugin
pnpm i -D html-webpack-plugin
//自动生成一个html文件,并且导入ts和css文件
6.2 webpack-dev-serve
pnpm i -D webpack-dev-server
//在项目中加载一个服务器,直接可以在线调试heml页面
6.3 clean-webpack-plugin
在打包时,清除dist目录下的打包文件,重新生成
6.4配置插件
// 导入webpack插件
const CleanWebpackplugin=require('clean-webpack-plugin')
const HtmlWebpackplugin=require('html-webpack-plugin')
///
plugins:[
new CleanWebpackplugin(),
new HtmlWebpackplugin({
// 设置模板html
template:"./src/index.html"
})
],
// 用来设置应用模板
resolve:{
// 哪些文件可以用来当作引用文件
extensions:['.ts','.js']
}
}
template:"./src/index.html",这里在路径下面新建一个模板页面,可以自己随意编辑,然后导入路径,虚拟服务器就基于你的这个页面进行显示。
效果展示:
6.webpack+babel优化兼容性
6.1安装插件
pnpm i -D @babel/core @babel/preset-env babel-loader core-js
对babel进行配置
// 导入一个路径包
const path = require("path")
// 导入webpack插件
const { CleanWebpackPlugin } = require("clean-webpack-plugin")
const HtmlWebpackplugin = require("html-webpack-plugin")
// webpack中所有的配置信息都写在module.exports中
module.exports = {
// 指定入口文件
entry: "./src/index.ts",
// 指定打包文件所在目录
output: {
// 指定打包文件的目录
path: path.resolve(__dirname, "dist"),
// 打包后的文件名
filename: "bundle.js",
environment:{
// 告诉webpack使用箭头函数。
arrowFunction:false
}
},
// 设置mode
mode: "development",
// 指定webpack打包时要使用的模块
module: {
// 指定加载规则
rules: [
{
// test指定的是规则生效的文件
test: /\.ts$/,
// 要使用的loader
use: [
//配置babel
{
//指定加载器
loader: "babel-loader",
//设置babel
options: {
//设置预定义的环境
presets: [
[
//指定编译环境的插件
"@babel/preset-env",
//配置信息
{
//要兼容的目标浏览器
targets: {
chrome: "88",
IE: "11",
},
// 指定corejs的版本---corejs作用是在浏览器不支持时,调用自身的某一个方法进行补充
corejs: "3",
// 使用corejs的方式,按需加载usage
useBuiltIns: "usage",
},
],
],
},
},
"ts-loader",
],
// 要排除的文件
exclude: /node_modules/,
},
],
},
plugins: [
new CleanWebpackPlugin(),
new HtmlWebpackplugin({
// 设置模板html
template: "./src/index.html",
}),
],
// 用来设置应用模板
resolve: {
// 哪些文件可以用来当作引用文件
extensions: [".ts", ".js"],
},
}
---------------箭头函数被替换---------bundle.js中
修改要打包文件时,打包文件也会出现兼容性
打包文件--const 变成var
7.面向对象(一切皆对象)
7.1类(class)
定义一个类:
初始化一个项目:npm init -y
创建tsconfig.json配置文件:
{
"compilerOptions": {
"module": "CommonJS",
"target": "ES5",
"strict": true,
// 输出的js文件存放位置
"outDir": "./dist"
},
// 需要编译的文件
"include": [
"./src/**/*"
]
}
实例:
// 使用class关键字定义一个类
class Person{
// 属性
name:string="孙悟空";
readonly age:number=500;
// 方法:
sayHello(){
console.log("俺老孙来也!");
};
// 静态属性,原生person对象可以访问,new的对象不可以访问
static sex="男"
}
// 生成一个实例对象
const per=new Person()
// 可以直接调用
console.log(per.name);
console.log(per.sayHello);
// 上面关键字--readonly(可读,不可以修改)
// 静态属性,原生person对象可以访问,new的对象不可以访问
console.log(Person.sex);
效果:
7.2构造函数
class Dog{
name:string;
age:number;
// 构造函数--在调用实例对象的时候,立即执行
constructor(name:string,age:number){
//this指向调用者,谁调用它指向谁。
this.age=age;
this.name=name;
}
//方法
bark(){
console.log(this);
}
}
const dog=new Dog("小白",4);
const dog2=new Dog("小黑",3);
console.log(dog);
console.log(dog2);
console.log("----------------------------");
//指向dog这个实例
console.log(dog.bark());
7.3继承extends
// 定义父类
class Animal{
name:string;
age:number;
// 构造函数
constructor(name:string,age:number){
this.age=age;
this.name=name;
}
// 方法
sayHello(){
console.log("动物的叫~");
}
}
/**
* 定义子类,实现代码复用
* 用extends关键字,进行父类代码的继承。
* 在继承的基础上,子类中可以添加可以修改。
* 在继承后,在子类中覆盖父类中的代码叫做重写
*/
class Cat extends Animal{
// 覆盖重写
sayHello(): void {
console.log("喵喵喵~");
}
// 添加
active(){
console.log(`${this.name}在跳跃!`);
}
}
class Dog04 extends Animal{
sayHello(): void {
console.log("汪汪汪~");
}
}
// 创建实例
const dog1=new Dog04("小白",4);
const cat=new Cat("小刘",3);
console.log(dog1);
console.log(cat.active());
7.4super关键字
// 采用立即执行函数去避免class类名重复
(function(){
// 定义父类
class Animal{
name:string;
age:number;
// 构造函数
constructor(name:string,age:number){
this.age=age;
this.name=name;
}
// 方法
sayHello(){
console.log("动物的叫~");
}
}
/**
* 定义子类,实现代码复用
* 用extends关键字,进行父类代码的继承。
* 在继承的基础上,子类中可以添加可以修改。
* 在继承后,在子类中覆盖父类中的代码叫做重写
* super关键字代指父类
*/
class Cat extends Animal{
sayHello(){
super.sayHello()
}
// 添加
active(){
console.log(`${this.name}在跳跃!`);
}
constructor(name:string,age:number){
//在子类中调用构造函数之前必须调用父类构造函数
super(name,age);
}
}
})()
7.5抽象类和方法
// 采用立即执行函数去避免class类名重复
;(function () {
// 定义父类
abstract class Animal {
name: string
age: number
// 构造函数
constructor(name: string, age: number) {
this.age = age
this.name = name
}
// 方法
abstract sayHello(): void
}
/**
* 可以在父类前面加上一个abstract,定义成抽象类
* 这样父类就只能用来继承,不能用来new 实例
* 在父类中,添加abstract 在方法前面,表示抽象方法,子类继承父类后,必须对他进行重写。
*/
class Cat extends Animal {
sayHello(): void {
console.log("喵喵~")
}
}
})()
7.6接口
(function () {
// 定义一个接口
/**
* 相当于type对于类型的定义,接口是对于class类结构的规范。
* 接口中没有实际值,所有的方法都是抽象的。
* 没有实际值
*/
interface myface {
name: string
sayHello(): void
}
// 接口调用
class myclass implements myface {
name: string
constructor(name: string) {
this.name = name
}
sayHello(): void {
console.log(" hello ")
}
}
})()
7.7属性的封装
;(function () {
/**
* public 修饰的属性可以在任何位置访问和修改
* private 私有属性,只能在当前类的内部进行访问和修改
* 如果不加以限制,属性可以被任意修改,数据会变得非常不安全。
*/
class Person {
// 私有属性
private _name: string
private _age: number
constructor(name: string, age: number) {
this._name = name
this._age = age
}
// 设置函数进行修改和读取
//读取
public get name(): string {
return this._name
}
public get age(): number {
return this._age
}
// 修改
public set name(v: string) {
this._name = v
}
public set age(v: number) {
if(v>=0){
this._age = v
}
}
}
// 创建实例对象
const person=new Person("小唐",18);
// 读取
console.log(person.name,person.age);
// 修改
person.age=20;
})()
7.8泛型
(function(){
/**
* 在定义函数或则是类的时候,如果遇到类型不明确就可以使用泛型
* 泛型是编程语言中一种强大的特性,它允许程序员编写更通用、更灵活的代码。泛型的核心思想是使用类型参数来创建可以操作多种类型的函数、类或接口,而不是仅限于特定的数据类型。以下是泛型的详细解释和用法:
### 泛型的概念
泛型提供了一种方式,使得代码能够以类型安全的方式操作多种数据类型。类型参数通常用大写字母(如 `T`、`U`、`V` 等)表示,它们在编译时被具体化,以确保类型安全。
### 泛型的好处
1. **类型安全**:泛型帮助编译器在编译时检查类型错误,而不是在运行时。
2. **代码复用**:泛型允许你编写一次代码,然后用于多种数据类型,无需为每种类型编写重复的代码。
3. **灵活性**:泛型提供了一种方式,使得函数或类可以接受不同类型的输入,同时保持内部逻辑不变。
### 泛型的用法
泛型可以用在函数、类、接口等的声明中。以下是一些示例:
#### 泛型函数
```javascript
function identity<T>(arg: T): T {
return arg;
}
// 使用
let output = identity<string>("Hello World"); // T 被具体化为 string
console.log(output); // "Hello World"
let num = identity<number>(42); // T 被具体化为 number
console.log(num); // 42
```
#### 泛型类
```javascript
class Stack<T> {
private items: T[] = [];
push(item: T): void {
this.items.push(item);
}
pop(): T {
return this.items.pop();
}
}
// 使用
let numberStack = new Stack<number>();
numberStack.push(1);
numberStack.push(2);
console.log(numberStack.pop()); // 2
```
#### 泛型接口
```javascript
interface Pair<T, U> {
first: T;
second: U;
}
// 使用
let pair = <Pair<number, string>>{ first: 1, second: "one" };
console.log(pair); // { first: 1, second: "one" }
```
#### 泛型约束
有时你可能需要对泛型参数施加一些限制,比如只允许它被某些特定的类型或具有某些属性的类型所使用。这可以通过使用 `extends` 关键字来实现:
```javascript
function getProperty<T extends { name: string }>(obj: T, key: 'name'): string {
return obj[key];
}
let person = { name: "Alice", age: 25 };
console.log(getProperty(person, 'name')); // "Alice"
```
在这个例子中,`T` 被约束为至少具有一个 `name` 属性的类型。
### 泛型在JavaScript中的实现
JavaScript 的泛型是通过 TypeScript 引入的,TypeScript 是一个超集于 JavaScript 的语言,它在编译时添加了类型检查。原生 JavaScript (ES5 及之前版本) 并不支持泛型,但现代 JavaScript (ES6+) 通过类型推断提供了一定程度的类型安全。
泛型是 TypeScript 的核心特性之一,它使得 JavaScript 开发者能够编写出更加健壮和可维护的代码。如果你使用的是 TypeScript 或者现代 JavaScript 编译器,你可以利用泛型来提升你的代码质量。
*/
function fn<T>(a:T):T{
return a;
}
})()
8.贪吃蛇--例子ts练习
1.初始化文件-snakes
npm init -y
2.安装插件less和css
pnpm i -D less css less-loader css-loader
安装postcss打包文件
pnpm i -D postcss postcss-loader
3.配置文件:
3.1.webpack.config.js
// 导入一个路径包
const path = require("path")
// 导入webpack插件
const { CleanWebpackPlugin } = require("clean-webpack-plugin")
const HtmlWebpackplugin = require("html-webpack-plugin")
const { brotliCompress } = require("zlib")
// webpack中所有的配置信息都写在module.exports中
module.exports = {
// 指定入口文件
entry: "./src/index.ts",
// 指定打包文件所在目录
output: {
// 指定打包文件的目录
path: path.resolve(__dirname, "dist"),
// 打包后的文件名
filename: "main.js",
environment: {
// 告诉webpack使用箭头函数。
arrowFunction: false,
},
},
// 设置mode
mode: "development",
// 指定webpack打包时要使用的模块
module: {
// 指定加载规则
rules: [
{
// test指定的是规则生效的文件
test: /\.ts$/,
// 要使用的loader
use: [
//配置babel
{
//指定加载器
loader: "babel-loader",
//设置babel
options: {
//设置预定义的环境
presets: [
[
//指定编译环境的插件
"@babel/preset-env",
//配置信息
{
//要兼容的目标浏览器
targets: {
chrome: "88",
ie: "11",
},
// 指定corejs的版本---corejs作用是在浏览器不支持时,调用自身的某一个方法进行补充
corejs: "3",
// 使用corejs的方式,按需加载usage
useBuiltIns: "usage",
},
],
],
},
},
"ts-loader",
],
// 要排除的文件
exclude: /node_modules/,
},
//添加less配置环境
{
test: /\.less$/,
//从下到上执行
use: ["style-loader", "css-loader", "less-loader",
//引入postcss
{
loader:"postcss-loader",
options:{
postcssOptions:{
plugins:[
[
"postcss-preset-env",
{
// 兼容两个最新的浏览器
browers:"last 2 versions"
}
]
]
}
}
}],
},
],
},
plugins: [
new CleanWebpackPlugin(),
new HtmlWebpackplugin({
// 设置模板html
template: "./src/index.html",
}),
],
// 用来设置应用模板
resolve: {
// 哪些文件可以用来当作引用文件
extensions: [".ts", ".js",".less",".css"],
},
}
3.2 tsconfig.json
{
"compilerOptions": {
"module": "CommonJS",
"target": "ES5",
"strict": true,
"noEmitOnError": false
}
}
3.3不想安装插件的,直接pnpm i 一键安装
前提是你创建了这个文件--package.json
{
"name": "snack",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"dev": "webpack --mode development",
"build": "webpack --mode production",
"start": "webpack serve --open http://localhost:8080/"
},
"keywords": [],
"author": "",
"license": "ISC",
"devDependencies": {
"@babel/core": "^7.25.2",
"@babel/preset-env": "^7.25.3",
"babel-loader": "^9.1.3",
"clean-webpack-plugin": "^4.0.0",
"core-js": "^3.38.0",
"css": "^3.0.0",
"css-loader": "^7.1.2",
"html-webpack-plugin": "^5.6.0",
"less": "^4.2.0",
"less-loader": "^12.2.0",
"postcss": "^8.4.41",
"postcss-loader": "^8.1.1",
"postcss-preset-env": "^10.0.0",
"style-loader": "^4.0.0",
"ts-loader": "^9.5.1",
"typescript": "^5.5.4",
"webpack": "^5.93.0",
"webpack-cli": "^5.1.4",
"webpack-dev-server": "^5.0.4"
}
}
目录:
4.贪吃蛇less文件
//重置
*{
margin: 0;
padding: 0;
box-sizing: border-box;
}
// 主窗口的样式
#main{
height: 800px;
width:600px;
background-color: #bfa;
margin: 150px auto;
border: 10px solid #000;
border-radius: 13px;
position: relative;
}
/**
主游戏界面
*/
#body{
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
background-color: #bcde97;
border: 2px solid #000;
height: 650px;
width: 550px;
/**
蛇
*/
.snake{
&>div{
width: 10px;
height: 10px;
background-color: #000;
border: 1px solid #565252;
position: absolute;
}
}
&>#food{
width: 10px;
height: 10px;
position: absolute;
left: 40px;
top: 100px;
display: flex;
justify-content: space-between;
flex-flow: row wrap;
&>div{
width: 4px;
height: 4px;
transform: rotate(45deg);
background-color: #000;
}
}
}
#footer{
display: flex;
justify-content: space-around;
margin-top: 20px;
height: 100px;
width: 100%;
span{
font-family: 'Courier New', Courier, monospace;
font-size: 20px;
font-weight: bolder;
}
}
5.贪吃蛇ts文件