TS学习使用
一、ts环境搭建
1.ts简介
typescript 是 javascript 的一个超集,在js的基础上,添加了变量类型的限制
2.环境
1.安装node:https://nodejs.org/dist/v16.1...
2.使用包管理器安装ts编译器typescript
npm install -g typescript
编译运行:
// tsc =====> typescript compiler// 编译 将指定ts编译编译成.js,tsc hell.ts -w可完成文件修改后的自动重新编译
tsc hello.ts// 运行编译后的.js
node hello.js
3.可使用ts-node,一次性完成ts的编译与运行
// 安装ts-node
npm install -g ts-node// 运行ts
ts-node hello.ts
二、ts的基本类型
1.类型声明的基本使用方式:
let a: number;
let b: string = "hello";
function fn(x:number, y:string):void{
console.log(x, y);
}
2.常用类型 number、string、boolean类型:
let a:string;
let b:boolean;
function fu():number{
return 1;
}
字面量类型:
// 直接使用字面量进行类型声明,使用时相当于常量
// 可以使用 | 来连接多个类型
let sex: "male" | "female";
sex = 'male';
any类型:
//任意类型,等同于没有类型限制了
let d: any;
// 显示any类型
let m;
// 隐式any类型
unknown类型:
let s: string;
// unknown 实际上就是类型安全的any
// unknown 类型的变量,不能直接赋值给其它类型的变量
let e: unknown = "hello";
// 将unknown赋值给其它类型
// 方法一:类型判断
if(typeof e === "string"){
s = e;
}// 方法二:类型断言
// s = (e);
s = e as string;
void与never:
// void 返回值为空值
function fn():void{
return undefined||null;
}// never 不会有返回值,常用于用来报错的函数
function fn2():never{
throw new Error('error');
}
object类型:
// 对象声明一:
let a: object;
// 可以是任何类型的对象,一般不适用// 对象声明二:
let b: {//对象类型声明,包含属性限制
name: string,
age? : number// ? 表示改属性可选
};
b = {
name: 'jiangjiangwa',
age: 18
}// 对象声明三:
let c:{
name: string,// 任意的字符串属性名,任意类型的any属性值
[x: string]: any
}
函数结构类型声明:
// (形参:类型,形参:类型)=>返回值类型
let f :(arg1:number,arg2:number)=>numberf = function(n1,n2):number{
return n1+n2;
}
array类型:
// 表示数字数组
let a:number[];
let b:Array;
tuple固定长度的数组:
let h:[123,string];
h = [123, "world"];
enum枚举类型:
enum Gender {
Male,
Female,
}console.log(Gender)
let i: { name: string;
gender: Gender };
i = {
name: "孙悟空",
gender: Gender.Male, // 'male'
};
联合类型:
let a:number|string;
a = 1;
let b : {name:string}&{age:number};
b = {
name:'jiangjiangwa',
age:18
}
类型的别名
type myType = string | number;
let k:myType = 'hello';
三、ts编译选项
初始化ts编译配置文件tsconfig.json
tsc --init使用tsconfig.json后,可批量编译整个项目的所有ts文件
// tsc 直接编译所有ts文件// tsc -w 编译所有ts文件并监视所有ts文件
tsconfig.json配置参数说明:
{
/*
tsconfig.json 是ts编译器的配置文件,ts编译器会读取该文件,并且根据该文件的配置来编译ts文件。
"include": 用来指定那些ts文件需要被编译
路径:**递归匹配任意子目录
*表示任意文件
?匹配一个任意字符(不包括目录分隔符*/
"include": ["./src/**/*.ts", "./src/**/*.js", "./main.ts"],
//"exclude": ["./node_modules"],//有默认值
"compilerOptions": {
//target 用来指定ts被编译为的ES的版本
"target": "ESNext", //ES5、ES6/ES2015、ES7/ES2016、ES2017、ES2018、ES2019、ES2020、ESNext
"module": "es2015", //指定编译为模块化规范//lib 用来指定哪些库是需要被包含在编译后的js中可以指定多个
// "lib": ["dom","es6"] // 默认不变"outDir": "./dist", //指定编译后的js文件输出目录// 设置outFile后,所有全局作用域中的代码,回合并到统一的js文件中,一般使用打包工具完成
// "outFile": "./dist/bindle.js",// 是否对js文件进行编译,默认是false
"allowJs": true,// 是否检查js代码的语法,默认是false,需要在tsconfig.json中设置"allowJs": true
"checkJs": true,"removeComments": false, //是否移除注释,默认是false// 不生成编译后的js文件,默认是false.但只需要对ts进行语法检查时,使用
"noEmit": false,// 所有严格检查的总开关
"strict":true,// 发生错误时,不生成编译文件,默认是false
"noEmitOnError": true,"alwaysStrict": true, //是否开启严格模式,默认是false,当使用了模块化语法时,默认开启了严格模式// 不允许使用隐式any类型,默认是false
"noImplicitAny": true,// 不允许不明确类型的this
"noImplicitThis": true,"strictNullChecks": false, //是否开启严格空值检查,默认是false}
}
五、面向对象
1.类的使用
// 使用class关键字定义一个类
/*
对类的属性(实例属性、静态属性)和方法进行描述
在对类的静态方法或实列属性进行赋值时,需要被限制
*/class Person {
// 静态属性
static readonly county: string = "中国";
// 实例属性
name: string = "default";
age = 18;
constructor(name: string, age: number) {
this.name = name;
this.age = age;
}// 实列方法
//say: (a: number, b: number) => void = function (a, b) {
//console.log(a + b);
//};
say(a: number, b: number): number {
return a + b;
}
}const person = new Person("John", 30);
extends使用:
开放封闭原则(OCP,Open Closed Principle),修改是封闭的, 对扩展开放。
class Animal {
name: string;
age: number;
constructor(name: string, age: number) {
this.name = name;
this.age = age;
}
say() {
console.log("I am a animal");
}
}class Dog extends Animal {
constructor(name: string, age: number) {
super(name, age);
}
}class Cat extends Animal {
say(): void {
console.log('miao miao miao')
}
// 没有重写contructor方法,创建的实例会调用父类的构造函数
}Cat.prototype.__proto__ = Animal.prototype
抽象类abstract:
(function () {
// 不能用来创建实列,专门用来继承的类
// 可以添加抽象方法
abstract class Animal {
name: string;
age: number;
constructor(name: string, age: number) {
this.name = name;
this.age = age;
}// 抽象方法,只能定义在抽象类中,子类必须实现该方法
abstract say(): void;
}class Dog extends Animal {
constructor(name: string, age: number) {
super(name, age);
}
say(): void {
console.log('wang wang wang')
}
}class Cat extends Animal {
say(): void {
console.log("miao miao miao");
}
// 没有重写contructor方法,创建的实例会调用父类的构造函数
}
})();
接口interface
const obj: myInterface = {
name: "John",
age: 30,
gender: "男",
say() {
console.log("jiang");
},
};
console.log(obj);
// 结构用来定义类的结构,也可当作类型声明使用
// 可重复声明,类型限制叠加,接口中,所有方法,都是抽象方法
// 实现接口,就是满足接口的要求
interface myInterface {
name: string;
age: number;
}interface myInterface {
gender: string;
say(): void;
}class Person implements myInterface {
name: string;
age: number;
gender: string;
constructor(name: string, age: number, gender: string) {
this.name = name;
this.age = age;
this.gender = gender;
}
say(): void {
throw new Error("Method not implemented.");
}
}
console.log(new Person('jiang',18,'男'));
属性封装:
(function () {
class Person {
private _name: string;
get name(): string {
return this._name;
}
set name(value: string) {
if (this.name.startsWith("张")) {
this._name = value;
} else {
this._name = "张" + value;
}
}
age: number;
constructor(name: string, age: number) {
this._name = name;
this.age = age;
}
}let p = new Person("John", 30);
console.log(p);
p.name = "Tom";
p.age = 10;
console.log(p);
})();
class+属性封装的简写:
class Dog {
constructor(public name: string, private age: number) {}// 等同于
// public name: string;
// private age: number;
// constructor(name: string, age: number) {
//this.name = name;
//this.age = age;
// }
}
【TS使用】泛型:
function fn(a: T): T {
return a;
}// 不指定泛型,会使用类型推断
console.log(fn("1"));
console.log(fn(19));
/*
在定义函数或是类是,如果遇到类型不明确就可以使用泛型
定义了一个表示类型的变量
*/interface Inter {
length: number;
}/*
泛型限制,需要符合接口类型限制
T extends Inter 表示泛型T必须是Inter实现类(子类)
*/
function fn2(a: T): number {
return a.length;
}fn2("1");
推荐阅读
- 用大白话让你理解TypeScript的要点.(三)
- react使用 create-react-app 构建基于TypeScript的React前端架构----上
- [TypeScript] Create Explicit and Readable Type Declarations with TypeScript mapped Type Modifiers(代码
- deno|deno连接mysql数据库
- deno|deno简易封装一个http服务器(路由-上篇)
- create-react-app + Typescript脚手架搭建
- Vue2.5 Web App 项目搭建 (TypeScript版)
- Typescript|react类组件及函数组件中使用typescript
- TypeScript + React + Redux 实战简单天气APP全套完整项目