typescrpit学习

用于记录自己对typescript学习笔记
1.类型断言
① 变量 as 类型
②<类型>变量
2.类型
基本类型 number / string / boolean / any(不推荐)

let a:number; // 类型声明
let a:object; // 不推荐用于声明对象

在js中object类型 { } / [ ] / function(){}

// 对象声明
let b:{name:string,age?:number}
b= {name:'green',age:19} // 这样子声明表示b对象中必须要有name属性,age属性可选,但不能添加其他属性

{ } 用来指定对象中可以包含哪些属性
{属性名:属性值,属性名:属性值} ,在属性名后面加上?表示属性是可选的。

// 如果在字典中只想对部分属性进行属性设置
//[propName:string]:any 表示任意类型的属性
let c:{name:string,[propName:string]:any}

函数类型定义

let d:(a:number,b:number)=>number
// 表示d是一个函数,有两个形参,类型为number类型,返回值也是number类型

数组类型的声明
① 类型[]
②Array<类型 >

let e:string[] // 表示字符串数组

let f:number[] // 表示数值数组

元组,就是固定长度的数组

let h:[string,number] // 元组
// 表示h是长度为二的数组,一个类型为字符串,一个类型为数字

enum 枚举,所有可能的情况进行列举

// 枚举使用
enum Gender{
	Male=0,
	Female=1
}
let i:{name:string,gender:Gender}
i={
	name:'green',
	gender:Gender.Female,
}
let j : string | number//  “ | ” 表示或

类型的别名

type myType = 1 | 2 | 3 | 4
let a :myType

3.编译选项
监视ts文件变化,对ts文件实时编译成js文件

tsc app.ts(文件名) -w

新建一个tsconfig.json 文件
tsconfig.json 是ts编译器的配置文件,ts编译器可以根据它的信息来对代码进行编译

tsc --init // 可以使用改命令进行生成tsconfig.json 文件

配置选项
1、include:用来指定哪些ts文件需要被编译,里面写路径
路径:** 表示任意目录
* 表示任意文件
2、exclude:不需要编译,本身存在着默认值[“node_modules”,“bower_components”,“jspm_packages”]

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

3、compilerOptions 编译器的选项
target: 用来指定ts被编译为的es的版本
module:指定要使用的模块化的规范
lib: 用来指定项目中要使用的库
outDir:用来指定编译后文件所在的目录
outFile:将代码合并为一个文件,设置outFile后,所有的全局作用域中的代码会合并到同一个文件中
allowJs :是否对js文件编译,默认时false
cheackJs :是否检查js代码是否符合语法规范,默认时false
removeComments:是否移除注释 类型:Boolean
noEmit: 不生成编译后的文件 类型:Boolean
noEmitOnError:当有错误时不生成编译文件 类型:Boolean
alwaysStrict:在ts编译后的文件是否使用严格模式,默认false,当文件中使用了模块,默认进入到严格模式
noImplicitAny:不允许隐式的any类型 ,类型:Boolean
noImplicitThis:不允许不明确类型的this, 类型:Boolean
strictNullChecks:严格的检查空值
strict:所有严格检查的总开关 ,类型:Boolean

{
	"compilerOptions":{
		"target":"ES6",
		"outDir":"./dist",
		"outFile":"./dist/app.js", // 将多个ts文件编译在一个文件中
	}
}

4.webpack 打包ts代码
1、依赖的安装

npm i -D webpack webpack-cli typescript ts-loader html-webpack-plugin webpack-dev-server clean-webpack-plugin @babel/core @babel/preset-env babel-loader core-js

// html-webpack-plugin 帮助我们自动的生成html文件
// webpack-dev-server webpack开发服务器,相当于安装了一个内置的服务器,热更新
// clean-webpack-plugin 在打包的时候自动删除原来的dist文件,保证每次打包的dist文件都是最新的
在package.json 文件中添加两行指令

//@babel-loader 使得webpack和js结合的一个工具
// @babel/preset-env 解决浏览器兼容的问题

"bulid": "webpack",
"start":"webpack serve --open chrome.exe"

2、tsconfig.json 文件 的生成

tsc --init

3、webpack.config.js 文件的配置

// 引入一个包
const path = require('path');
// 引入html插件
const ClearWebpackPlugin = require('clean-webpack-plugin');
const HtmlWebpackPlugin = require('html-webpack-plugin');

module.exports = {
    // 指定入口文件
    entry: './src/index.ts',

    // 指定打包文件所在目录
    output: {
        // 指定打包文件的目录
        path: path.resolve(__dirname, 'dist'),
        // 打包后文件的文件
        filename: "bunndle.js",
        // 告诉webpack不使用箭头函数
        environment:{
            arrowFunction:false
        }

    },
    // 指定webpack打包时要使用的模块
    module: {
        // 指定要加载的规则
        rules: [
            {
                // test指定的是规则生效的文件 
                //  /\.ts$/匹配所有ts结尾的文件
                test: /\.ts$/,
                // 要使用的loader
                use: [
                    // 配置babel
                    {
                        // 指定加载器
                        loader:'babel-loader',
                        // 设置babel
                        options:{
                            // 设置预定的环境
                            presets:[
                                [
                                    // 指定环境的插件
                                    "@babel/preset-env",
                                    // 配置信息
                                    {
                                        // 需要兼容浏览器的版本
                                        targets:{
                                            "chrome":"88"
                                        },
                                        // 指定corejs的版本
                                        "corejs":"3",
                                        // 使用corejs的方法 "usage" 表示按需加载
                                        "useBuiltIns":"usage"


                                    }
                                ]
                            ]
                        }
                    },
                    'ts-loader'],
                // 要排除的文件
                exclude: /node-modules/
            }
        ]
    },

    // 配置webpack插件
    plugins: [
        new ClearWebpackPlugin(),
        new HtmlWebpackPlugin({
            // 定义了网页模板
            template: './src/index.html'
        }),
    ],

    // 用来设置引用模块
    resolve: {
        extensions: ['.ts', '.js'] // 表示ts 和js文件结尾的文件都可以作为模块使用
    }
}

5.ts中类定义

class Person{
	// 定义实例属性(可读可写)
	name:string = 'green'
	// readonly 开头的属性只读,不可修改
	// static readonly 静态只读属性
	readonly sex:string = 'male'
	// 在属性前使用static关键字,可以定义类属性(静态属性)
	static age:number = 18
}
const per = new Person()
// 静态属性的调用,通过类去调用,实例无法调用
console.log(Person.age)

// 直接定义的属性是实例属性,需要通过实例对象去访问
// 使用static开头的属性是静态属性(类属性),可以直接通过类去访问

抽象类:以abstract开头的类是抽象类,抽象类和其他类区别不大,只是不能用来创建对象,抽象类就是专门用来被继承的类,抽象类中可以添加抽象方法

abstract class Animal{
	name:string,
	constructor(name:string){
	this.name = name
	}
	// 定义一个抽象方法
	// 抽象方法没有方法体,只能定义在抽象类中,子类必须对抽象方法进行重写 --> 提供给子类重写 
	abstract say():void;// void没有返回值
}

6.接口
接口用来定义一个类结构,用来定义一个类中应该包含哪些属性和方法,同时接口也可以当成类型声明去使用(接口和类型 类似)

// 接口 
interface myInterface{
	name:string;
	age:number;
}

1、接口可以在定义类型的时候去限制类的结构,接口中的所有属性都不能有实际的值,
2、接口只定义对象的结构,而不考虑实际值
3、在接口中所有的方法都是抽象方法

// 定义类时,可以使用类去实现一个接口(类似继承),通过 implements 去实现

// 接口就是一个规范
class Myclass implements myInterface{

}

7.属性的封装

(function(){
	// TS 可以在属性钱添加属性的修饰符
	// public 修饰的属性可以在任意位置访问(修改)公共属性
	// private 私有属性,私有属性只能在类内部进行访问(修改) -- 通过在类中添加方法使得私有属性可以被外部访问
	// protected 受包含的属性,只能在当前类和当前类的子类中访问(修改) --该属性只能在继承的子类中访问,实例对象无法访问到该属性
	class Person{
		public name:string;
		private age:number;
	}
	constructor(name:string,age:number){
		this.name = name;
		this.age = age
	}
	
	// getter 方法用来读取属性
	// setter 方法用来设置属性 - 她们被称为属性的存取器
	
	// 定义方法,用来获取name属性
	getName(){
		return this.name
	}
	// 定义方法,用来设置name属性
	setName(value:string){
		this.name= value
	}

	// TS中设置getter方法的方式 
	// get -- 表示getter 方法
	// name -- 表示方法名
	get name(){
		return this.name;
	}
	set name(value:string){
		this.name = value;
	}
	const per = new Person(name:'green',age:18)
	per.name = "aaaa" // 这里的name调用的时setter里的name方法
)()

class C{
	// 这样的写法,构造函数里直接生成了,不用写类似nmae=this.name 的代码了
	constructor(publice name:string,public age:num){
	}
}

8.泛型
在定义函数或是类时,如果遇到类型不明确就可以使用泛型

// 这几个T表示同一个类型
function fn<T>(a:T):T{
	return
}

// 可以直接调用具有泛型的函数
fn(a:10);  // 此时T就表示number类型; --不指定泛型,TS可以自动对类型进行判断
fn<string>(a:'hello'); // 指定泛型,此时泛型就表示string

可以指定多个泛型

function fn2<T,K>(a:T,b:K):T{
	return a
}

interface Inter{
	length:number;
}

// T extends Inter  表示泛型T必须是Inter实现类(子类)
function fn3<T extends Inter>(a){
	return a.length
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值