从零开始学typescript

news2024/9/25 15:41:52

https://coding.imooc.com/learn/list/412.html
公司花钱买的,我边学边做笔记

设置

vscode设置

在这里插入图片描述
然后下个Prettier - Code formatter
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
以后保存就能格式化了

下载ts

npm install typescript@3.6.4 -g ts版本
npm install -g ts-node@8.4.1 node执行ts文件
这样,以后就能

//demo.ts
console.log(123);

PS D:\touchFish\code\typeScript> ts-node.cmd .\demo.ts
123

一些类型?

// 基础类型就布兰、字符、数值就不一一列出
// 对象类型
const func1 = (str: string) => {
    return parseInt(str)
}

// 自定义对象类型
interface Person {
    name: string
}

const p: Person = {
    name: 'jack'
}

// 泛型类型?
let temp: number | string = 123;
temp = '456'

然后interface、class、type这3个写法都差不多?不知道区别是啥,不像java分那么细

元组

长度和类型都固定的数组

const tuple: [string, string, number] = ['a', 'b', 1]

interface

interface Person{
    // private 
    readonly name:string;
    // 可有可无的属性
    age?:number;
    // 允许有其他的属性
    [propName:string]:any;    
    // 要有个函数,返回类型为string
    say():string;
}

然后一样像Java,interface可以被interface 继承extends
然后class一样可以implementsinterface
interface一样地,只是写而没有实际地方法内容之类的,要在class中写

class

老Java了

// public 公共
// private 私有
// protected 允许类内和子类使用

class Person {
    public name: string;
    private age: number;
    protected sayHi() {
        this.name; //使用共有
        this.age; //允许类内使用
        console.log('hi');
    }
}

class Teacher extends Person {
    public say() {
        this.sayHi() //允许类内使用
        this.name
        // this.age//私有,读不了
    }
}

const T = new Teacher()
// console.log(T.sayHi());//访问不了,因为sayHi是protected,只允许类内和子类使用


构造器

老Java了

class Person {
    constructor(public name: string) { }
}

class Teacher extends Person {
    constructor(public name: string, public age: number) {
        super(name)
    }
}

const teacher = new Teacher('tom', 12);

get和set

老Java了

static单例模式

老Java了


class Person {
    private constructor(public name: string) { }

    static createObj(name: string) {
        return new Person(name)
    }
}

const p = Person.createObj('啊强')
console.log(p.name);

抽象类

老java了

ts文件使用js类的包

比如在ts中npm install js的包,会导致不识别,这时候可以再进行
npm install @types/xxx -D
这个相当于

ts —> xxx.d.ts (翻译文件,用于ts识别js) --> js

ts的文件配置

tsc --init

生成一个tsconfig.json文件,
顺便说,npm init -y可以生成package.json

很明显嘛,一些json,都是配置项,下面跟着视频用一些简单的配置

tsc

创建个文件,test.ts,


class A {
    name: string
    constructor(name: string) {
        this.name = name
    }
}

const asdasd = new A('aaa')
console.log(asdasd.name);

然后tsc,就会自动编译成js嘛

//test.js
"use strict";
var A = /** @class */ (function () {
    function A(name) {
        this.name = name;
    }
    return A;
}());
var asdasd = new A('aaa');
console.log(asdasd.name);

tsc就是自动将根目录的ts转变为js,
如果多个ts,但只想编译其中某几个,就可以再tsconfig.json中配置

{
  "include":["./test.ts"],
}

热更新

tsc -w

输出为单文件

这里是一个ts生成一个js,但也可以只生成一个js,只要设置

   "outFile": "./dist/page.js",                       /* Concatenate and emit output to single file. */

类型保护方式

class Bird {
    sing: () => {};
}

class Dog {
    bark: () => {};
}

// as 来做保护
function tarin(animal: Bird | Dog) {
    (animal as Bird).sing;
    (animal as Dog).bark;
}

// in来做保护
function tarin2(animal: Bird | Dog) {
    if ('sing' in animal) {
        animal.sing();
    } else {
        animal.bark();
    }
}

class NumberObj {
    count: number;
}

// instanceof来做保护
function add(first: object | NumberObj, second: object | NumberObj) {
    if (first instanceof NumberObj && second instanceof NumberObj) {
        return first.count + second.count;
    }
    return 0;
}

枚举

enum Status{
    OFF,
    ON,
    DELETE
}
console.log(Status);
console.log(Status.OFF);
console.log(Status[0]);

{ ‘0’: ‘OFF’, ‘1’: ‘ON’, ‘2’: ‘DELETE’, OFF: 0, ON: 1, DELETE: 2 }
0
OFF

泛型

function join<T>(first: T, second: T) {
    return `${first}${second}`;
}

const res = join<String>('1', '2')
console.log(res);

12

命名空间namespace

其实就是把类统筹到一起,叫做命名空间namespace
比如

//这有一个命名空间,有2个类
namespace Components {
    export class Header {
        constructor() {
            console.log('I am Header');
        }
    }

    export class Content {
        constructor() {
            console.log('I am Content');
        }
    }
}
//这有另一个命名空间,下面这段话相当于import引入的写法
///<reference path="Components.ts"/>

namespace Home {
    export class Page {
        constructor() {
            new Components.Content();
            new Components.Header();
        }
    }
}

然后我们设置打包

{
  "compilerOptions": {
    /* Basic Options */
    // "incremental": true,                   /* Enable incremental compilation */
    "target": "es5",                          /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019' or 'ESNEXT'. */
    "module": "amd",    //只支持amd或者system                 /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */
    "outFile": "./dist/page.js",     //输出单文件                  /* Concatenate and emit output to single file. */
    "outDir": "./dist",       //输出文件                 /* Redirect output structure to the directory. */
    "rootDir": "./src",      //要打包的文件                 /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */
    "strict": true,            
    "esModuleInterop": true                  
  }
}

导出来的js

装饰器

这和java的注解很是相似
要先开启tsconfig.json的

{
  "compilerOptions": {
    "experimentalDecorators": true,       
    "emitDecoratorMetadata": true,        
  }
}
function Path(target: any) {
    console.log('我是装饰器');

}

function PathParam(str1: string, str2: string) {
    return function (target: any) {
        console.log(str1 + str2);

    }
}

@Path
class Test { }

@PathParam('hello', 'world')
class Test2 { }

ts-node跑一下

我是装饰器
helloworld

方法的装饰器

// 普通方法:target对应类的prototype,key对应方法名,
// descriptor可以理解为一些设置,比如不可修改值之类的功能
function getNameDecorator(target: any, key: string,descriptor:PropertyDescriptor) {
    console.log(target);
    console.log(key);
}

class Test {
    name: string;
    constructor(name: string) {
        this.name = name;
    }

    @getNameDecorator
    getName() {
        return this.name
    }
}

{ getName: [Function (anonymous)] }
getName

不是很懂。。。。

访问器的装饰器

其实也是一个样

// 普通方法:target对应类的prototype,key对应方法名,
// descriptor可以理解为一些设置,比如不可修改值之类的功能
function visitDecorator(target: any, key: string, descriptor: PropertyDescriptor) {
    console.log(target);
    console.log(key);
}

class Test {
    private _name: string;
    constructor(name: string) {
        this._name = name;
    }

    get name() {
        return this._name
    }

    @visitDecorator
    set name(name: string) {
        this._name = name;
    }
}

{}
name

这个descriptor很神奇,有很多东西,具体可以看官网

属性的构造器

属性没有descriptor,要这样写

function visitDecorator(target: any, key: string) {
    const descriptor:PropertyDescriptor = {
        writable:false
    }
    return descriptor
}

参数的构造器

function paramDecorator(target: any, method: string, paramIndex: number) {
    console.log(target);
    console.log(method);
    console.log(paramIndex);
}

class Test {
    getInfo(@paramDecorator name: string, age: number) {
        // console.log(name, age);
    }
}

const test = new Test();
test.getInfo('Dell', 30)

实际应用

比如做一个通用的捕捉异常注解

const userInfo: any = undefined

function catchError(target: any, key: string, descriptor: PropertyDescriptor) {
    // 这里就代表函数里面的所有内容,比如为 reruen userInfo.name
    const fn = descriptor.value;
    descriptor.value = function () {
        try {
            fn();
        } catch (e) {
            console.log('userInfo有问题');
        }
    }
}

class Test {
    @catchError
    getName() {
        return userInfo.name
    }
}

const test = new Test()
test.getName()

userInfo有问题

常见的一些操作

1. 配置统一参数

比如一些vueuse的,都是统一一个options参数,然后要配置的话就写参数进去,无的话就默认配置。js我不知道怎么实现,但ts很容易配置

//这是一个接口,2个参数都是可选的
interface config {
  loading?: boolean
  b?: string
}

//这里,config={}是为了占位符,一般都是在最后面才做的这个
export function test(config: config = {}) {
	//定义常量
  const {
    //如果loading原本有值的话,就取config.loading里面的,否则就默认是true。这种写法对js来说是无的
    loading = true,
    b = '123',
  } = config
  console.log(loading, b)
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/367108.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

_linux (TCP协议通讯流程)

文章目录TCP协议通讯流程TCP 和 UDP 对比TCP协议通讯流程 下图是基于TCP协议的客户端/服务器程序的一般流程: 服务器初始化: 调用socket, 创建文件描述符;调用bind, 将当前的文件描述符和ip/port绑定在一起;如果这个端口已经被其他进程占用了, 就会bind失 败;调用listen, 声…

FPGA入门系列15--SPI(文末有易灵思核心板及配套下载线)

文章简介 本系列文章主要针对FPGA初学者编写&#xff0c;包括FPGA的模块书写、基础语法、状态机、RAM、UART、SPI、VGA、以及功能验证等。将每一个知识点作为一个章节进行讲解&#xff0c;旨在更快速的提升初学者在FPGA开发方面的能力&#xff0c;每一个章节中都有针对性的代码…

国家推进招投标全过程电子签,契约锁帮助组织减负91%

根据某工程建设集团反馈&#xff0c;电子签章的应用帮助招投标工作实现&#xff1a;“参与方5分钟内线上实名认证&#xff1b;招标、中标通知等格式文件最快2分钟完成盖章&#xff1b;标书等大体量文件20分钟内盖章生成&#xff1b;专家实名认证远程评标、10分钟完成线上开标&a…

leetcode 502. IPO(上市,3种方法)

假设leetcode 即将上市&#xff0c;如何筹集资金的问题。 有两个数组profits和capital, 分别代表第 i 个项目有多少净利润 和 需要多少启动资金。 手上的原始资金是w, 用这个w的资金去启动项目&#xff0c;完成项目之后净利润会加到w上&#xff0c;再做下一个项目&#xff0c; …

硬件原理图中的“英文缩写”大全

设计原理图时&#xff0c;网络标号要尽量简洁眀了。本文总结了一下基本的表示方法&#xff0c;供大家参考。常用控制接口 EN&#xff1a;Enable&#xff0c;使能。使芯片能够工作。要用的时候&#xff0c;就打开EN脚&#xff0c;不用的时候就关闭。有些芯片是高使能&#xff0c…

SPI机制源码:JDK Dubbo Spring

JDK 17 Dubbo 3.1.6 JDK SPI JDK SPI在sql驱动类加载、以及slf4j日志实现加载方面有具体实现。 示例 public class Test {private static final Logger logger LoggerFactory.getLogger(Test.class);public static void main(String[] args) {ServiceLoader<JdkSpiServi…

软件测试计划怎么写?模板在这呢

目录 第1章 引言 第2章 项目背景 第3章质量目标 第4章 资源需求 第5章 测试策略 第6章 测试计划 总结感谢每一个认真阅读我文章的人&#xff01;&#xff01;&#xff01; 重点&#xff1a;配套学习资料和视频教学 第1章 引言 1.1目的 简述本计划的目的&#xff0c;旨…

【THREE.JS学习(3)】使用THREEJS加载GeoJSON地图数据

本文接着系列文章&#xff08;2&#xff09;进行介绍&#xff0c;以VUE2为开发框架&#xff0c;该文涉及代码存放在HelloWorld.vue中。相较于上一篇文章对div命名class等&#xff0c;该文简洁许多。<template> <div></div> </template>接着引入核心库i…

RPC(3)--基于 Nacos 的服务发现与负载均衡版

nacos:提供了一组简单易用的特性集&#xff0c;帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。Nacos 是构建以“服务”为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施。 nacos架构如下(图片来源) 依赖包&#xff1a; <dependency>…

国内领先的十大API接口排行

应用程序编程接口API即&#xff08;Application Programming Interface&#xff09;&#xff0c;现在众多企业的应用系统中常用的开放接口&#xff0c;对接相应的系统、软件功能&#xff0c;简化专业化的程序开发。 一、百度API 百度API超市开通1136个数据服务接口。 网址&a…

git 的使用方法 (下 - 远程仓库和图形化)

目录前言&#xff1a;一、什么是协同开发二、Gitee 使用协同开发1. 首先注册一个码云账号2. 新建一个仓库3. 根据下图把新建仓库设置为开源4. 在远端合并分支的方法5. 链接 git 远程6. 提交&#xff08;同步&#xff09;远程7. 远程拉取至本地8. 远程分支三、git 图形化的使用1…

ROS2手写接收IMU数据(Imu)代码并发布

目录前言接收IMU数据IMU的串口连接问题python接收串口数据python解析数据ROS2发布IMU数据可视化IMU数据效果前言 在前面测试完了单独用激光雷达建图之后&#xff0c;一直想把IMU的数据融合进去&#xff0c;由于经费的限制&#xff0c;忍痛在淘宝上买了一款便宜的IMU—GY95T&am…

实验室设计|兽医实验室设计|SICOLAB

新建兽医实验室时&#xff0c;需要考虑以下几个方面&#xff1a;&#xff08;1&#xff09;实验室建筑设计&#xff1a;实验室建筑设计应充分考虑实验室的功能需求&#xff0c;例如安全、通风、排水、电力等方面的设计&#xff0c;确保实验室内部环境的稳定和安全。&#xff08…

XX项目自动化测试方案模板,你学会了吗?

目录 1、引言 2、自动化实施目标 3、自动化技术选型 4、测试环境需求 5、人员进度安排 总结感谢每一个认真阅读我文章的人&#xff01;&#xff01;&#xff01; 重点&#xff1a;配套学习资料和视频教学 1、引言 文档版本 版本 作者 审批 备注 V1.0 Vincent XXX …

selenium环境安装及使用

selenium简介官网https://www.selenium.dev简介用于web浏览器测试的工具支持的浏览器包括IE&#xff0c;Firefox,Chrome&#xff0c;edge等使用简单&#xff0c;可使用java&#xff0c;python等多种语言编写用例脚本主要由三个工具构成&#xff0c;webdriver,IDE,web自动化环境…

【深度学习】优化器

1.什么是优化器 优化器是在深度学习的反向传播过程中&#xff0c;指引损失函数&#xff08;目标函数&#xff09;的各个参数往正确的方向更新合适的大小&#xff0c;使得更新后的各个参数让目标函数不断逼近全局最小点。 2.优化器 2-1 BGD 批量梯度下降法&#xff0c;是梯度下…

【阿旭机器学习实战】【33】中文文本分类之情感分析--朴素贝叶斯、KNN、逻辑回归

【阿旭机器学习实战】系列文章主要介绍机器学习的各种算法模型及其实战案例&#xff0c;欢迎点赞&#xff0c;关注共同学习交流。 目录1.查看原始数据结构2.导入数据并进行数据处理2.1 提取数据与标签2.2 过滤停用词2.3 TfidfVectorizer将文本向量化3.利用不同模型进行训练与评…

如何使用HTTPS加密保护网站?

加密 Web 内容并不是什么新鲜事&#xff1a;自发布通过SSL/TLS协议来加密 Web 内容的规范以来&#xff0c;已经过去了近 20 年。然而&#xff0c;近年来&#xff0c;运行安全的HTTPS加密 Web 服务器已经从一种选择变成了一种安全防护的必需品。攻击者继续寻找并找到窃取用户和W…

计算机网络概述 第二部分

5.网络分层 ①OSI 7层模型 数据链路层 (Data Link Layer) 实现相邻&#xff08;Neighboring&#xff09;网络实体间的数据传输 成帧&#xff08;Framing&#xff09;&#xff1a;从物理层的比特流中提取出完整的帧 错误检测与纠正&#xff1a;为提供可靠数据通信提供可能 …

算法笔记(十三)—— 树形DP及Morris遍历

树形DP&#xff1a; Question1: 以X为头结点的树&#xff0c;最大距离&#xff1a; 1. X不参与&#xff0c;在左子树上的最大距离 2. X不参与&#xff0c;在右子树上的最大距离 3. X参与&#xff0c;左树上最远的结点通过X到右树最远的结点 最后的结果一定是三种情况的最大…