Web学习之TypeScript

2023-11-10

一. TypeScript是什么

  • TypeScript是JavaScript类型的超集,扩展了 JavaScript 的语法;
  • TypeScript 设计目标是开发大型应用,它能编译出纯净、简洁的JavaScript代码,可以运行在在任何浏览器、任何计算机和任何操作系统上,并且是开源的;
  • TypeScript 通过类型注解提供编译时的静态类型检查,就能将调试从运行期提前到编码期,诸如类型检查、越界检查这样的功能才能真正发挥作用;
  • TypeScript的开发体验远远超过以往纯JavaScript的开发体验,无需运行程序即可修复潜在bug;
  • TypeScript支持未来的ES6甚至ES7。在TypeScript中,可以直接使用ES6的最新特性,在编译时它会自动编译到ES5。

在这里插入图片描述

二. TypeScript配置

  1. 安装好NodeJS后,以管理员身份运行终端,使用npm -g install ts-node typescript命令进行全局安装;
  2. 在VS Code中开发,安装TSLint、TypeScript Hero、Bracket Pair Colorizer等插件;
  3. 新建一个.ts后缀的文件,任意写一段JS代码,点击运行试试是否配置成功。

三. 变量声明

使用letconst新的声明方式来代替var,并加上类型说明,且作用域为块级即以{}为界。
const是对let的一个增强,它能阻止对一个变量再次赋值。

例如:

let lang: string = 'TypeScript';//如果省略类型说明,TS也可进行自动推断
lang = 1010;//error! 如果需要可以使用联合类型:let lang: number | string = 'TS';
let age: number = 89;
let age = 64;//error!

const pi: number = 3.14159;//pi以后不可改变,类似常量
pi = 3.14;//error!

四. 解构

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

//解构数组
let input = [89, 64, 2018, 10];
let [first, second] = input;//注意使用[]
console.log(first); // 89
console.log(second); // 64
let [one, ...others] = input; //...other表示将剩余的数组展开
console.log(...others);  //64 2018 10
let newArr = [89, ...others, 18];
console.log(newArr);  // [ 89, 64, 2018, 10, 18 ]

//解构对象
let o = {
  a: "foo",
  b: 12,
  c: "bar"
};
let {a, b} = o;//注意使用{},且变量名需与对象中道属性名一致
console.log(a, b);  //foo 12

五. 函数

TypeScript为JavaScript函数添加了额外的功能,让我们可以更容易地使用。

1. 使用完整函数类型定义

变量名:类型
function 函数名():返回值类型{}

//命名函数,有完整的参数和返回类型。可以不用,TS将自动进行类型推断但推荐使用!
function add(x: number, y: number): number {
  return x + y;
}
//匿名函数
let myAdd = function(x: number, y: number): number { return x + y; };
console.log(myAdd(1, '2'));//error
console.log(myAdd(1));//error
console.log(typeof myAdd(1, 2));//number 

2. 可选参数

JavaScript里,每个参数都是可选的,可传可不传;没传参的时候,它的值就是undefined。
在TypeScript里使用变量名?:类型实现可选参数的功能。

例如,我们想让last name是可选的:

function buildName(firstName: string, lastName?: string) {
    if (lastName)
        return firstName + " " + lastName;
    else
        return firstName;
}
console.log(buildName("Bob"));  // works correctly now
console.log(buildName("Bob", "Adams", "Sr."));  // error, too many parameters
console.log(buildName("Bob", "Adams"));  // right

注意:可选参数必须放在必要参数后面!!


3. 默认参数

在TypeScript里,我们也可以为参数提供一个默认值,当用户没有传递这个参数或传递的值是undefined时,它们叫做有默认初始化值的参数。

修改上例,把last name的默认值设置为"Smith":

function buildName(firstName: string, lastName = "Smith") {
    return firstName + " " + lastName;
}
console.log(buildName("Bob"));                  // right, returns "Bob Smith"
console.log(buildName("Bob", undefined));       // right, returns "Bob Smith"
console.log(buildName("Bob", "Adams", "Sr."));  // error, too many parameters
console.log(buildName("Bob", "Adams"));         // right

在所有必须参数后面的带默认初始化的参数都是可选的,与可选参数一样,在调用函数的时候可以省略。

注意:与可选参数不同的是,默认参数不需要放在必须参数后面


4. 剩余参数

必要参数,默认参数和可选参数有个共同点:它们表示某一个参数。

有时,你想同时操作多个参数,或者你并不知道会有多少参数传递进来, 在TypeScript里,你可以把所有参数收集到一个变量里。

function greeting(firstName: string, ...restName: string[]) {
  return `Hello ${firstName} ${restName.join(' ')}!`;
}
console.log(greeting('Osama', 'bin', 'Muhammad', 'bin', 'Awad', 'bin', 'Laden'));
console.log(greeting('Laden'));
 //剩余参数,会被当做个数不限的可选参数。可以一个都没有,也可以有任意个

5. 箭头函数

JavaScript里,this的值在函数被调用的时候才会指定。 这是个既强大又灵活的特点,但需要花时间弄清楚函数调用的上下文是什么,这不是一件很简单的事,尤其是在返回一个函数或将函数当做参数传递的时候。

为了解决这个问题,我们在函数被返回时就绑好正确的this。而箭头函数就能保存函数创建时的this值,而不是调用时的值。

//无参数,函数体代码只有一行,则该行结果即为函数返回值
let greeting1 = () => `Hello TS!`;
console.log(greeting1());  // Hello TS!

//一个参数,函数体代码只有一行,则该行结果即为函数返回值
let greeting2 = (name: string) => `Hello ${name}`;
console.log(greeting2('Kitty'));  // Hello Kitty

//两个及以上的参数,函数体代码只有一行,则该行结果即为函数返回值
let add1 = (n1: number, n2: number) => n1 + n2;
console.log(add1(1, 2));   // 3

//两个及以上的参数,函数体代码多于一行,则必须用{}包裹,且显式给出return
let add2 = (n1: number, n2: number) => {
  let sum = n1 + n2;
  return sum;//改为sum++结果如何?
}
console.log(add2(1, 2));  // 3

六. 类Class

TypeScript 是面向对象的 JavaScript。
类描述了所创建的对象共同的属性和方法。
TypeScript 支持面向对象的所有特性,比如 类、接口等。

1. 类的定义和使用

//类的定义和使用
class MyInfo { //class是关键字,类名默认全部大写首字母
  name: string; //属性
  weather: string; //属性
  
  constructor(name: string, weather: string){ //构造函数,一般用于初始化。如果没有,TS会自动生成一个,以备用new创建类实例时调用。
    this.name = name;
    this.weather = weather;
  }
  printInfo(): void { //其它函数,无返回值
    console.log(`Hello, ${this.name}.`);
    console.log(`Today is ${this.weather}.`);
  }
}
let myData = new MyInfo('Jon', 'raining'); //使用new关键字生成对象,即该类的实例
myData.printInfo();

2. 类的属性和函数的访问权限

类中的属性和函数都有访问权限,默认为public即全局可访问;protected是在类的内部和其子类的内部可访问;private只能在该类内部可访问。

//访问权限
class MyInfo { 
  public name: string; //public属性,可省略
  private _weather: string; //私有属性,习惯以_开头进行命名
  
  constructor(name: string, weather: string){ //构造函数,一般用于初始化
    this.name = name;
    this._weather = weather;
  }
  printInfo(): void { //其它函数
    console.log(`Hello, ${this.name}.`);
    console.log(`Today is ${this._weather}.`);
  }
}

let myData = new MyInfo('Jon, 'raining'); //使用new关键字生成对象
console.log(myData._weather); //error!
myData.printInfo(); 

3. 存取器

TypeScript支持通过gettersetter来截取对对象成员的访问, 它能帮助你有效的控制对对象成员的访问。
当在类外部时,建议设置gettersetter操作其private属性,即使public属性也如此。

//getter和setter
class MyInfo { 
  private readonly _name: string; //私有属性,外部不可访问。readonly使其只能在初始化时赋值,以后不可更改。    
  private _weather: string; //私有属性

  constructor(name: string, weather: string){ //构造函数,一般用于初始化
    this._name = name;
    this._weather = weather;
  }
  get name(): string {
    return this._name;
  }
  set name(value: string) {  //error! _name有readonly属性
    this._name = value;
  }
  get weather(): string {
    return this._weather;
  }
  set weather(value: string) {
    this._weather = value;
  } 
}
  
let myData = new MyInfo('Jon', 'raining'); //使用new关键字生成对象
console.log(myData._name, myData._weather);
myData._weather = 'sunny'; //OK
myData._name = 'Wang'; //error!
console.log(myData);
 readonly关键字将属性设置为只读的,只读属性必须在声明时或构造函数里被初始化。
 只带有get不带有set的存取器自动被推断为readonly。

4. 静态属性

static 关键字用于定义类的数据成员(属性和方法)为静态的,静态成员可以直接通过类名调用。

//静态属性,内建或自定义,无需new即可使用
console.log(Math.round(89.64)); //90
console.log(Math.pow(2, 8)); //256
class MyStaticClass {
  static place = 'Earth';
  static printInfo() {
    console.log('We have only one Earth!');
  }
}
console.log(MyStaticClass.place);  //Earth
MyStaticClass.printInfo();

5. 继承

类继承使用关键字 extends,子类除了不能继承父类的私有成员(方法和属性)和构造函数,其他的都可以继承。

class Animal {
    // 当构造函数传入的参数加上了“访问权限控制符”,则同时会声明同名类属性,并赋值
    constructor(public name: string) { }
    protected log(message: string) {
      console.log(message);
    }
    move(distanceInMeters: number = 0) {        
      this.log(`${this.name} moved ${distanceInMeters}m.`);//请注意name来自何处
      this.log('==============');
    }
  }
  
  class Horse extends Animal {
    constructor(name: string) { 
      super(name); // 通过super调用父类构造器
    }
    run(distanceInMeters = 50) { //自己独有的函数
      this.log("Clop, clop..."); 
      super.move(distanceInMeters); // 通过super调用父类方法
    }
  }
  
  let tom: Horse = new Horse("Tommy");
  tom.run(66);

执行结果为:
在这里插入图片描述

注意:TypeScript 一次只能继承一个类,不支持继承多个类,但TypeScript 支持多重继承(A 继承 B,B 继承 C)。

七. 模块Module

  • 对于大型的项目,我们需要使用模块进行管理。每个 .ts 文件就是一个模块,通过 export 来对外部模块暴露元素,通过 import 来引入模块。
  • 模块是自声明的;两个模块之间的关系是通过在文件级别上使用importsexports建立的。

语法格式如下:

// 文件名 : SomeInterface.ts 
export interface SomeInterface { 
   // 代码部分
}

要在另外一个文件使用该模块就需要使用 import 关键字来导入:

import someInterfaceRef = require("./SomeInterface");

八. 总结

TypeScript的设计解决了JavaScript的问题,让程序模块化,利于我们开发大型程序。
总的来说TypeScript还是比较容易上手的,因为它只是在JavaScript上扩展了语法。且编辑器提供精准的语法提示,让我们更方便地实践面向对象的编程。

九. 学习资料

https://typescript.bootcss.com/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Web学习之TypeScript 的相关文章

  • 如何让 Google Apps 脚本进行 SHA-256 加密?

    我需要使用文本输入 1 轮 十六进制输出 SHA 256 加密来加密字符串 这应该是一个长度为 64 的字符串 我在 Google Apps 脚本文档中尝试过的每个 SHA 256 加密模块都会返回一组数字 例如 function SHA2
  • Exceljs:迭代每行和每列的每个单元格

    我想在所有单元格中添加粗边框 这是一个有角度的项目 我正在使用打字稿 我可以为 1 个单元格做到这一点 worksheet getCell A1 border top style thick left style thick bottom
  • 整个页面都是玻璃板

    有没有一种简单的方法可以在整个 HTML 页面上拥有一个 玻璃窗格 而不管缩放 幻灯片事件 平台 浏览器 移动 桌面 我所说的 简单 是指纯 CSS 支持 而不是插件 后备 插件建议也可能有用 Thanks 如果您只是指所有内容之上的一层
  • 如果Functions是javascript中的对象,为什么function.constructor指向Function而不是Object?

    当像这样从窗口对象创建以下函数时 function userInfo 既然函数是对象 为什么 userInfo constructor 显示 Function 而不是 Object 当使用以下内容时 它甚至显示函数而不是对象 Functio
  • 如何使用 Underscore 获取 JavaScript 数组中的重复项

    我有一个数组 我需要重复的项目并根据特定属性打印这些项目 我知道如何使用 underscore js 获取唯一项目 但我需要找到重复项而不是唯一值 var somevalue name john country spain name jan
  • FP-TS 分支(面向铁路的编程)

    我在尝试使用 FP TS 实现事物时不断遇到的一种模式是 当我的管道涉及到 TaskEither 的分支和合并分支时 合并似乎工作得很好 因为我可以使用sequenceT创建数组并将它们通过管道传输到函数中 然后使用所有这些值 似乎不太有效
  • Chart.js - 如何将数组集合推入数据集

    我一直在尝试多种方法将数组集合推送到数据集中 任何人都可以帮助我根据下面的代码将数组推入堆积图表中 这是例子 Codepen 堆叠栏 https codepen io narendrajadhav pen abzpWam JavaScrip
  • jQuery 中如何判断 JSON 对象是否为空

    我有以下 JSON meta limit 20 next null offset 0 previous null total count 0 objects 我对对象感兴趣 我想知道对象是否为空并显示警报 像这样的东西 success fu
  • 无法提取 Typescript 中的对象值

    我一直在尝试将 JavaScript Web 表单转换为 Typescript 但无法弄清楚如何处理以下内容 在 JavaScript 中有效 let fieldValues JSON parse cookieData let keys O
  • toJSON() 和 JSON.Stringify() 之间的区别

    如果您需要读取或克隆模型的所有数据属性 请使用其 toJSON 方法 此方法返回属性的副本作为 对象 尽管有其名称 但不是 JSON 字符串 当 JSON stringify 为 使用 toJSON 方法传递一个对象 它将返回的字符串化 t
  • 使用带有十六进制字符串的 CryptoJS

    我想连接到蓝牙设备 仅通过十六进制字符串进行通信 我需要编码一个 16 字节值 因此我也期望一个 16 字节的值 在我的实现中 CryptoJS 总是返回更长的结果 根据文档 不需要 IV 所有 16 字节数据必须使用当前存储在设备中的客户
  • React JS“this”没有按预期工作

    我有下面的代码 save function var this this console log this refs itemText this setState isEditing false function console log In
  • jQuery 如何通过不同的列值计算表中的行数

    如何按表列计算不同的表行 Example table thead tr th NAME th th TECHNOLOGY th tr thead tbody tr td john td td jQuery td tr tr td mark
  • 使用 jQuery 更改 SVG 元素的“xlink:href”属性

    我正在尝试使用单击事件更改 xlink href 属性 到目前为止它部分有效 这就是我正在做的 HTML a href class ui btn ui corner all ui shadow editIcon style text ali
  • 谷歌浏览器如何启动桌面应用程序?

    我真的不知道术语 所以我将从一个例子开始 如果我点击磁力链接 Google Chrome 会询问我是否要启动 torrent 客户端 我单击 确定 chrome 启动该应用程序 该应用程序根据链接执行一些操作 现在有办法查看应用程序如何从
  • Bootstrap 3 - 模态背景不会根据模态对话框的高度调整大小?

    我将一个表单放入模式中 并尝试在用户触发单选按钮时显示表单的一些隐藏字段 显示隐藏字段后 模态自动重新缩放的高度 但模态背景的高度不能用作模态对话框 我该如何解决它 div class modal fade div class modal
  • onClick 事件适用于触摸屏设备上的触摸吗?

    我用过onclick我的网站上的活动 但是 当我在谷歌浏览器的开发人员模式移动视图中打开它时 触摸使用鼠标单击的元素没有任何反应 所以我的问题是 我还必须添加吗ontouch事件连同onclick事件或 onClick 事件适用于所有触摸屏
  • 自动更改 Twitter Bootstrap 选项卡

    我希望 Twitter Bootstrap 选项卡按时间顺序更改 我使用它们有点像旋转木马 我希望选项卡每 10 秒切换到下一个选项卡 这是一个例子 http library buffalo edu http library buffalo
  • 在 Sublime Text 下获取完整的 JS 自动补全

    我刚刚在 Windows Vista 下安装了 Sublime Text 甚至遵循了中给出的建议这个帖子 https stackoverflow com questions 10636410 modifying sublime text 2
  • 在 Map() 的条目上使用 Promise.all

    我正在使用 Map 来表示一些键 值对 let myMap new Map myMap set foo bar myMap set foo2 bar42 对于每个 Map 条目 我执行一个返回 Promise 的函数 所有这些 Promis

随机推荐

  • redis后端启动及关闭

    本文笔记为传智教程视频截图整理 redis前端启动 无法部署集群
  • 浅谈 malloc 函数在单片机上的应用

    聊聊 malloc函数 在单片机程序设计中怎么使用 目录 前言 一 malloc 函数简介 二 malloc 之于单片机 2 1 malloc 函数申请的内存在哪里 2 2 用与不用malloc的区别 三 malloc可能遇到的问题 3 1
  • RGMII时序约束

    RGMII是以太网MAC连接PHY的一种接口 可以实现10 100 1000M网络速度 在FPGA系统中比较常见 RGMII在1000M模式下是双沿采样 而且要求采样端是center aligned 所以其时序约束是比较复杂的 下面分TX和
  • Redis学习笔记04-基础知识

    测试性能 redis benchmark Redis官方提供的性能测试工具 参数选项如下 十六个数据库 默认使用的第0个 16个数据库为 DB 0 DB 15 默认使用DB 0 可以使用select n切换到DB n dbsize可以查看当
  • Java中的assert使用

    1 assertion 断言 是jdk1 4才开始支持的新功能 主要在开发和测试时开启 为保证性能 在正式发布后通常是关闭 2 Java中assertion与C中的assertion的区别在于 1 Java中是使用assert关键字去实现其
  • Derby 的安装&配置

    Derby 的安装 配置 原文 http zetcode com db apachederbytutorial install 在接下来的页面中 我们将展示如何安装 Derby 并根据需要配置 Derby 我们从 db apache org
  • redis安装教程

    redis安装教程 redis安装 redis安装教程 1 下载redis 2 解压 3 移动 放到usr local 录下 4 进 redis 录 5 生成 6 测试 这段运 时间会较 如果出现错误 此时需要安装tcl 如下 安装完tcl
  • Vue学习33----第三方日历组件ele-calendar 的使用(结合了lodash中的_.filter,_.find,_.map)

    文档地址 https www npmjs com package ele calendar https github com xuyanming ele calendar 效果图 组件
  • 面试题记录-- 对于软件测试的理解,测试的核心,测试策略

    记录面试遇到的题 个人理解 关于测试核心 怎么做好测试等等的问题 其实总结都是为了 预防 预防 预防 预防缺陷 把缺陷扼杀在摇篮里 测试效率 接口测试 敏捷 测试 你怎么看测试 软件测试是什么 分为哪几个阶段 怎么看测试 测试 已知测试需求
  • Java虚拟机基础知识整理

    文章目录 Java虚拟机基础知识整理 一 JVM的体系结构 二 类加载器详解 三 沙箱安全机制 一 沙箱安全发展历史 二 沙箱基本组件 四 Native以及方法区和寄存器 一 Native本地方法 二 PC寄存器 三 方法区 五 栈 Sta
  • JSP(机器调度问题)使用java进行数学建模并调用cplex求解

    机器调度问题 JSP问题 描述为 在给定每个工件的加工流程 每个工件使用机器的序列及每个工件每道工序的加工时间确定的情况下 安排工件的加工顺序 使得待加工的工件在机器上进行加工的最大完工时刻最小 接着上次的JSP模型 https blog
  • golang docker client通过ssh调用远程主机的接口

    golang通过tcp方式连接调用远程主机docker的接口 可参考 https mp csdn net mp blog creation editor 126315928 本文主要是用Go通过ssh方式连接到远程主机 调用docker接口
  • 配置chrony时间同步服务

    一 chrony简介 chrony 的优势 更快的同步 从而最大程度减少了时间和频率误差 对于并非全天 24 小时运行的虚拟计算机而言非常有用 能够更好地响应时钟频率的快速变化 对于具备不稳定时钟的虚拟机或导致时钟频率发生变化的节能技术而言
  • Linux 免费学习路线大全,你想要的都在这里啦(持续更新,欢迎收藏❤️关注点赞加评论)

    为什么学 Linux 相比于 Windows Linux 免费 开源 安全 灵活 稳定 便于开发 所以更受企业青睐 甚至 90 以上 的企业应用都是用 Linux 服务器部署的 无论是前端 后端 算法 测试 运维等计算机相关岗位的同学 都建
  • Batch Normalization详解

    Batch Normalization 原理 1 Batch Normalization的提处背景 1 1 常见的帮助收敛的方法 在深度学习中 随着网络层数的加深 模型的收敛难度会越来越大 为了让模型更好的收敛 涌现出了各种各样的调参方法
  • Java8 HashMap源码解析

    HashMap底层数据结构 HashMap底层数据结构是 数组 链 如下图 当满足以下两个条件 链表会转为红黑树 1 数组长度等于或大于64 2 链表长度等于或大于8 如果数组长度小于64 链表长度等于或大于8 不会把链表转为红黑树 而是扩
  • SpringMVC中如何使用注解的方式实现文件上传呢?

    转自 SpringMVC中如何使用注解的方式实现文件上传呢 一 form表单注意事项 上传文件所处的表单 表单必须使用以下属性 enctype multipart form data method POST 二 applicationCon
  • vue-鉴权的两种方法之路由拦截

    vue中鉴权的两种方法 常用的鉴权有两种 一种是路由拦截 一种是动态路由 路由拦截 通过vue router的beforeEach方法进行每一次路由访问的拦截 判断拦截信息中是否有鉴权要求或者权限校验 以此来实现鉴权 如果权限不够 访问的路
  • 透视Matplotlib核心功能和工具包 - Seaborn工具包

    Seaborn是基于Matplotlib构建的功能强大的可视化工具 它使多变量探索性数据分析更加容易和直观 并且增加了一些新类型的图 并且其背景样式和颜色图更加令人愉悦 它具有许多内置的统计功能 使其成为统计数据分析的首选工具 它还具有非常
  • Web学习之TypeScript

    文章目录 一 TypeScript是什么 二 TypeScript配置 三 变量声明 四 解构 五 函数 六 类Class 七 模块Module 八 总结 九 学习资料 一 TypeScript是什么 TypeScript是JavaScri