• TypeScript入门


    一、安装

    npm -g install ts-node typescript

    二、定义变量

    1、number类型

    1. // 先定义 后给值
    2. let a: number;
    3. a = 10;
    4. // 定义类型 直接给值
    5. let a: number = 10;
    6. // 声明不给类型直接给值, 给什么值就是什么类型
    7. let a = 10

    2、boolean类型

    let a: boolean = false

     3、声明不给类型直接给值 给什么值就是什么类型

    let a = false; // 类型为boolean

    4、使用字面量进行类型声明

    1. let a: 10;
    2. a = 10;
    3. a = 11; // 报错
    4. //联合类型
    5. let b: 1 | 2;
    6. b = 1;
    7. b = 2;
    8. b = 3; // 报错 b的值只能是1和2
    9. // c的类型可以是boolean、string两种类型
    10. let c: boolean | string;

    5.、any任意类型

    1. let d: any; // 显示声明any类型
    2. d = 10;
    3. d = 'hello';
    4. d = true;
    5. let a; // 隐式any

     6、unknown表示未知类型的值 

    1. let e: unknown;
    2. e = 10;
    3. e = 'hello';
    4. e = true;
    5. let d: any;
    6. s = d; // d是类型是any,它可以赋值给任意类型

     未知类型不可以给已知的类型变量赋值

    1. let e: unknown;
    2. let s: string;
    3. s = e; // 报错e的类型是未知类型 而s是字符串类型
    4. // 解决办法
    5. 方法一:if判断一下
    6. if(typeof e === 'string'){
    7. s = e
    8. }
    9. 方法二:类型断言(用来告诉解析器变量的实际类型)
    10. s = e as string
    11. //或
    12. s =e;

     7、void用来表示空(用函数为例 , 表示没有返回值)

    1. function fn(): void {
    2. returnreturn undefine 或 returnfine
    3. }

     8、never 表示永远不会有返回结果

    1. function fn2(): never {
    2. throw new Error('报错了')
    3. }

    9、object

    1. let a: object;
    2. a = {}
    3. a = function() {}

    10、在属性名后上加?表示可选

    1. let b: { name: string, age?: number }
    2. b = { name: '郑建', age: 18}
    3. b = { name: '郑建'}

    11、[propName: string]: any(表示任意类型的属性)

    1. let c: {name: string, [propName: string]: any};
    2. c = { name: '郑建'age: 18, gender: '男' }

    12.数组声明

    1. // 类型[]
    2. // Array<类型>
    3. // string[]表示数组里面的元素都是string类型
    4. let e: string[];
    5. e = ['a', 'b', 'c']
    6. // Array 表示数组里面的元素都是数字
    7. let g: Array;
    8. g = [1, 2, 3]

    13、元组类型 (就是不可变的数组)

    1. let h: [string, string];
    2. h = ['hello', 'a']

    14、enum枚举

    1. enum Gender {
    2. male = 0,
    3. female = 1,
    4. }
    5. let i: { name: string, gender: Gender }
    6. i = {
    7. name: '郑建'
    8. gender: Gender.male
    9. }
    10. console.log(i.gender === Gender.male);

    15、类型别名

    1. type myType = 1 | 2 | 3 | 4
    2. let k: myType;
    3. k = 6; //报错 k的值只能是1 2 3 4

    二、let 与 const

    声明变量的时候,我们推荐是用letconst,而不推荐var,并加上类型说明,且作用域为块级即以{}为界。

    1. let lang: string = 'hello world';//如果省略类型说明,TS也可进行自动推断
    2. lang = 2022; //赋值错误! 如果需要可以使用联合类型:let lang: number | string = 'TS';
    3. let age: number = 20;
    4. const num: number = 6.66666;//num以后不可改变,只可以读取,类似常量
    5. num = 3.14; //错误

    三、解构

    将对象、数组中的元素拆分到指定变量中,以方便使用。

    1. //解构数组
    2. let array = [1, 2, 3, 4];
    3. let [one, two] = array; //注意使用[]
    4. console.log(one); // 1
    5. console.log(two); // 2
    6. let [first, ...others] = array; //剩余变量。...others是一个可变长度的数组
    7. console.log(...others); // 2 3 4
    8. //...是一个展开运算符
    9. let newArr = [0, ...others, 5];
    10. console.log(newArr); // 0 1 2 3 4 5
    11. //解构对象
    12. let People = {
    13. name: "xiaoyi",
    14. age: 20,
    15. sex: "male"
    16. };
    17. let {name, age} = People;//注意使用{},且变量名需与对象中道属性名一致
    18. console.log(name, age); // xiaoyi 20

    四、函数

     1、需要使用完整函数类型定义。

    1. //命名函数,有完整的参数和返回类型。可以不用,TS将自动进行类型推断但推荐使用!
    2. function sum(x: number, y: number): number {
    3. return x + y;
    4. }
    5. //匿名函数
    6. let res_sum = function(x: number, y: number): number { return x + y; };
    7. console.log(sum(1, '2')); //参数类型必须和形参的类型一致
    8. console.log(sum(1)); //参数个数必须和函数的形参个数一致
    9. console.log(typeof sum(1, 2)); //打印出函数的返回值类型

    2、可选参数

    1. //可选参数,必须放在必要参数后
    2. function greeting(firstName: string, lastName?: string) {
    3. if(lastName) { //判断lastname是否有值传进来
    4. return `Hello ${firstName} ${lastName}!`; //使用模板字符串进行拼接
    5. }
    6. return `Hello ${firstName}!`;
    7. }
    8. console.log(greeting('周'));
    9. console.log(greeting('周', '晓忆'));
    10. console.log(greeting('周', '晓忆', '你好')); //参数个数 !== 函数的形参个数不一致,产生错误。

    3、默认参数【有缺省值】

    1. //默认参数,不必在必要参数后
    2. function greeting(firstName: string, lastName = 'yinjie') {
    3. return `Hello ${firstName} ${lastName}!`;
    4. }
    5. console.log(greeting('zhou'));
    6. console.log(greeting('zhou', 'xiaoyi'));
    7. console.log(greeting('zhou', 'xiaoyi', 'Yong'));//参数个数 !== 函数的形参个数不一样发生错误!

    4、不定长参数

    1. //剩余参数,会被当做个数不限的可选参数。可以一个都没有,也可以有任意个
    2. function greeting(firstName: string, ...restName: string[]) {//...代表的是一个可变长度的数组
    3. return `Hello ${firstName} ${restName.join(' ')}!`;
    4. }
    5. console.log(greeting('zhou', 'wang', 'li', 'liu', 'guan', 'zhang', 'qin'));
    6. console.log(greeting('zhou'));

    5、箭头函数

    特点:简化函数定义、解决this问题。但是可读性比较差。

    1. // 无参数,函数体代码只有一行,则该行结果即为函数返回值
    2. let greeting1 = () => `Hello TS!`; // return可以省略
    3. console.log(greeting1()); // Hello TS!
    4. // 一个参数,函数体代码只有一行,则该行结果即为函数返回值
    5. let greeting2 = (name: string) => `Hello ${name}`; // return可以省略
    6. console.log(greeting2('QiGe')); // Hello QiGe
    7. //两个及以上的参数,函数体代码只有一行,则该行结果即为函数返回值
    8. let add1 = (n1: number, n2: number) => n1 + n2;
    9. console.log(add1(1, 2)); // 3
    10. //两个及以上的参数,函数体代码多于一行,则必须用{}包裹,且显式给出return
    11. let add2 = (n1: number, n2: number) => {
    12. let sum = n1 + n2;
    13. return sum;//改为sum++结果如何?
    14. }
    15. console.log(add2(1, 2)); // 3

    五、类class

    类是属性和函数的集合,是生成对象(Object)或类实例的模板。

    1、类的定义和使用  

    关键字get 定义方法:  这个方法用于只读属性的,不可修改属性

    关键字set定义方法: 这个方法用于修改属性是

    readonly定义属性: readonly使其只能在初始化时赋值,以后不可更改

    1. // getter和setter
    2. class People { // class是关键字,类名默认全部大写首字母
    3. private readonly _name: string; // 私有属性,外部不可访问。readonly使其只能在初始化时赋值,以后不可更改。
    4. private _sex: string; // 私有属性,习惯以_开头进行命名
    5. constructor(name: string, sex: string){ // 构造函数,一般用于初始化
    6. this._name = name;
    7. this._sex = sex;
    8. }
    9. get name(): string {
    10. return this._name;
    11. }
    12. set name(value: string) { // 错误! _name有readonly属性,不可以被修改
    13. this._name = value;
    14. }
    15. get sex(): string {
    16. return this._sex;
    17. }
    18. set weather(sex: string) {
    19. this._sex = sex;
    20. }
    21. }
    22. let people = new People('zhouxiaoyi', 'male'); // 使用new关键字生成对象
    23. console.log(people.name, people.weather);
    24. people.weather = 'sunny'; // OK
    25. people.name = 'Wang'; // 只读属性,不可以被修改
    26. console.log(people);

    2、静态属性

    类中的属性或函数有static修饰,则可直接使用而不需要实例化

    1. // 静态属性,内建或自定义,无需new即可使用,可以直接通过类名进行访问
    2. // Math是一个包装类,自带的,里面的所有方法都是静态的。
    3. console.log(Math.round(89.64)); // 90
    4. console.log(Math.pow(2, 8)); // 256
    5. class Tool {
    6. static title = 'box';
    7. static printInfo() {
    8. console.log('The box can contain pens!');
    9. }
    10. }
    11. // 静态方法与静态函数可以直接通过类名直接访问。
    12. console.log(Tool.title);
    13. Tool.printInfo();

    3、继承
    面向对象有三大特性:封装、继承、多态。

    可以通过extends关键字继承其它类,从而成为其子类。

    1. class Animal {
    2. // 当构造函数传入的参数加上了“访问权限控制符”,则同时会声明同名类属性,并赋值
    3. constructor(public name: string) { }
    4. protected log(message: string) {
    5. console.log(message);
    6. }
    7. move(distanceInMeters: number = 0) {
    8. this.log(`${this.name} moved ${distanceInMeters}m.`); // 请注意name来自何处
    9. this.log('==============');
    10. }
    11. }
    12. class Horse extends Animal {
    13. constructor(name: string) {
    14. // 这里创建了构造函数 必须要调用父亲的构造器 通过super
    15. super(name); // 通过super调用父类构造器
    16. }
    17. run(distanceInMeters = 50) { // 自己独有的函数
    18. this.log("Clop, clop...");
    19. super.move(distanceInMeters); // 通过super调用父类方法
    20. }
    21. }
    22. class Eagle extends Animal {
    23. constructor(name: string) { super(name); }
    24. reborn() { // 自己独有的函数
    25. console.log('Reborn? It is a joke, hahaha!');
    26. }
    27. }
    28. let tom: Horse = new Horse("Tommy the Palomino");
    29. tom.run(8964);
    30. let sam: Eagle = new Eagle("Sammy the Hawk");
    31. sam.move(1024); // sam的move函数来自何处?
    32. sam.reborn();

    六、模块化、组件化、工程化

    我们经常说的模块化开发、组件化开发、工程化开发但是有些人可能对这种词比较陌生,下面我来说说, 

    模块化:模块化, 首先先知道模块是什么?   模块就是一个js文件,那模块化就是我们写的东西都放在一个一个js文件里,比如说公共的js逻辑代码    我们写好放到一个js里,   我们哪个页面需要的话就引入这个模块,这就是我理解的模块化开发,实现代码的复用  降低代码冗余、提高开发效率和降低开发成本。

    组件化: 一个页面可以分为很多很多的小组件,每个组件都有自己要实现的功能,而且有些组件可以多个页面的复用,需要就引入进来 ,这就是组件化开发

    工程化:工程化就好比厂里的流水线,一套流程下来该有的东西都给你安装上,不需要不一个一个依赖的引入,这个创建项目的时候用到比如   用vite创建项目   或则webpack创建项目

  • 相关阅读:
    Word控件Spire.Doc 【段落处理】教程(三):在 C#、VB.NET 中管理词标题以形成目录
    Asp.Net Core 7 preview 4 重磅新特性--限流中间件
    mysql 表被锁住,无法对表进行更新,删除操作
    UNDO自动管理和手工管理、闪回操作
    网络与信息安全基础知识--网络的协议与标准
    字节一面,面试官问我Vue3源码,我说……
    推荐一个带java环境的tomcat镜像,使用jdk 1.8.0_312
    对数据排序
    vue制作自己心仪的颜色仪表盘
    第七章第二节:B树和B+树
  • 原文地址:https://blog.csdn.net/qq_52421092/article/details/127645409