文章目录

  • 1.概述
  • 2.TS中的类型
    • 2.1.类型推断
    • 2.2.类型定义
    • 2.3.复杂类型
      • 2.3.1.联合
      • 2.3.2.泛型
    • 2.4.type关键字
  • 3. 总结

1.概述

TypeScript(TS)是JavaScript(JS)的超集,它只是在JS的基础上加入的TS的类型系统,也就是说,我们已经编写好的历史JS脚本在切换到TS时,可以不经过任何修改也能正常运行。
同时,TS的类型系统会将我们编写的脚本中不符合语法的部分标记出来,让实际运行时会出现的异常、错误或者一些意想不到的情况提前暴露出来,减少运行时bug出现的概率。
本文中的部分内容来自于《TypeScript官方文档》,由于本文只是简单的快速上手,想要查看更详细的问题,可以去官网文档进行查看。
此外,TypeScript官网还提供了在线编辑的页面,《TypeScript:Playground》可以在这个页面编辑并测试TS脚本。

2.TS中的类型

TypeScript的基本类型是由JavaScript中的类型:boolean, bigint, null, number, string, symbol, undefined加上新增的any,never,null组成。

2.1.类型推断

对于一个不确定类型的变量,我们可以通过typeof获取到变量的类型,例如:

const num = 1;
const str = 'Hello TS!';
console.log(typeof num);
console.log(typeof str);

会打印出,“number"和"string”,也就是说即使没有显式的定义变量的类型,,TS也会通过类型推断由变量值来推导变量的类型。

2.2.类型定义

在某些函数中,我们需要获取到变量的类型才能做下一步操作,就可以使用typeof来进行判断,以一个简单的函数为例:

const plus = (x , y) => {if (typeof x === 'number' && typeof y === 'number') {return x + y;}throw new Error('请输入数字');
}
console.log(plus(1 , 2);
// 如果没有使用typeof,则会打印'12',这与函数的初衷不符
console.log(plus(1 , '2');

使用TS时,我们只需要显式的定义参数的类型,即可在编码阶段就获取到错误提示。

上图中的number就是TS的核心语法,定义变量的类型,接下来列举一些常见的定义变量类型的方式。

基础变量类型
定义变量的类型,就是在给变量加上一个限制,只有满足这个限制,才能够正常的赋值。

let num: number = 1;
let bool: boolean = false;
let str: string = 'Hello';
// any类型可以表示可以赋值为任意类型
let anything: any = 2;
anything = true;
anything = '任意类型';
......

接口定义变量类型
当我们需要使用到对象,并对对象中的字段进行限制时,就可以使用接口来限制变量的类型,例如:

interface User {name: string,age: number,nickname?: string
}

在下列的示例中,通过User接口来定义对象,并且只初始化了name字段,就会提示我们缺少了age字段的初始化操作:

但是没有提示我们缺少nickname,这是因为 ?:表示的是可选属性,可以不填。
注:interface中除了使用基础的变量类型限制外,接口中的字段也可以用其他接口来做限制,例如:

interface System {user: User,name: string
}

函数形参变量类型
与接口同理,在函数的形参中,我们也可以使用?:来表示可选参数。

const printParam = (p1: string , p2?: string) => console.log(`${p1},${p2}`);
printParam('Hello','world');
printParam('Hello');

两种调用方式,都不会提示语法错误。

2.3.复杂类型

对于简单类型来说,限制字段的值只能是同一种类型,而复杂类型就是限制字段可以是多种类型中的其中一个。
我们可以通过两种形式来对复杂类型进行定义:联合,泛型。

2.3.1.联合

使用联合类型的方式很简单,在多个类型之间使用|进行连接,使用或的语义即可,比如我们希望一个字段既可以是数字,又可以是字符串:

let multi: number | string = 1;
multi = 'abc';

用一个更加详细的例子来说明联合的作用,假如现在有一个获取对象中的字段值的函数,需要限制传入的key是对象中的字段,我们除了可以限制变量的基础数据类型以外,还可以限制变量只能被赋值为一些具体的值,例如下面例子中的形参key

interface User {name: string,age: number,nickname?: string
}
let user:User = {name :'张三',age: 18,nickname: '翼德'
}
// 此处 key 的值只能是 name,age,nickname中的其中一个,如果不是,则会提示错误
const getProperty = (obj:User , key:'name'|'age'|'nickname'): any => {return obj[key];
}


现在我们对User进行修改,加入一个性别字段gender,可以想象到的是,我们也需要同时在key后面加入gender字段才行,这种情况,我们可以用keyof来更灵活的处理,下面我们把getProperty()函数做一点修改。

interface User {name: string,age: number,nickname?: string,gender: number
}
let user:User = {name :'张三',age: 18,nickname: '翼德',gender: 0
}
// keyof User 等价于 'name'|'age'|'nickname'|'gender'
const getProperty = (obj:User , key:keyof User): any => {return obj[key];
}
let myName1:string = getProperty(user,'gender');

使用keyof之后,无论对象中的字段如何增减,我们都不需要再修改函数形参的类型了。

2.3.2.泛型

TS中的泛型大多数情况是使用在函数上(也可以使用在类上),我们可以把泛型理解为一种特殊的参数,在调用函数的时候,可以显式或隐式的传入类型。
identity函数为例,我们定义一个简单的函数,传入什么参数就返回什么参数。

function identity(arg: any): any {return arg;
}
let ident:string = identity(123);

因为返回值的类型是any,所以对于程序来说,并不能明确的知道返回值的类型到底是什么,所以当我们把ident的类型定义为string时,编译器也不会提示我们异常。
想要明确返回值的类型与传入的参数值类型一致,可以使用泛型来处理,对上面的代码做一点的修改:

function identity<T> (arg: T): T {return arg;
}
let ident:string = identity<number>(123);

identity后使用<>来定义类型的形参,调用时同样使用<>传入实际的类型,与上面定义的any类型不同,此时编译器会提醒我们出现了类型转换异常。

除了显示的调用以外,更常用的方式是在调用时不传入类型参数,使用类型推断来隐式的传入参数类型:

// 等价于 let ident:number = identity<number>(123);
let ident:number = identify(123);

以上面2.3.1中的函数为例,我们可以使用泛型来更加灵活的处理参数与返回值之间的关系。

interface User {name: string,age: number,nickname?: string
}
let user:User = {name :'张三',age: 18,nickname: '翼德'
}
// K extends keyof T,表示将K泛型的范围限制在T对象的字段名范围内
const getProperty = <T,K extends keyof T>(obj:T , key:K): T[K] => {return obj[key];
}

T[K]代入到上面的User中,如果传入的key等于name,则返回值T[K]类型为string,同理,传入age,则返回值类型为number

2.4.type关键字

除了直接使用类型关键字来限制变量的类型之外,我们还可以使用type关键字来定义类型,例如:

type a = number;
type b = string;
type c = boolean;
type abc = number | string | boolean;
......

使用起来也很简单,将类型关键字直接替换为type定义的变量即可:

let num:a = 1;
let str:b = 'abc';
// 复杂类型的type
let multi:abc = 2;
multi = 'bcd';// 限制传入的是有length属性的参数
type strType = string | number[];
const getLength = (obj: strType) => obj.length;
console.log(getLength('daadsfadf'))
console.log(getLength([1,2,3,4,5]))
......

除此之外,type定义的变量,还可以被赋值为某些具体的值,表示在后续给变量赋值的时候,只能在这些值之间进行选择,例如:

type numType10 = 1 | 3 | 5 | 7 | 9;
let num:numType10 = 1;
// 此处会有错误提示
let num:numType10 = 2; // 更多的例子
type checkedStateType = 'checked' | 'unchecked';
type lockStateType = 'locked' | 'unlocked';
type visibleStateType = true | false;

3. 总结

  1. TS的作用是在编译期将可能出现的问题尽可能的暴露出来,从而减少运行期出现bug的概率。
  2. 给变量定义的类型可以是基础数据类型,也可以是自定义的interface,还可以是某些具体的值。
  3. 可以通过|联合的方式将单一的类型限制组合为复杂的多个类型限制。
  4. 泛型的出现使用函数的封装更加灵活且复用性更高,此外也可以明确的对应出入参的关系。
  5. 使用typeof可以获取到变量的类型,使用keyof可以获取到对象的字段名类型。

【TypeScript】(一)快速上手TypeScript类型语法相关推荐

  1. 快速上手 TypeScript

    快速上手 TypeScript ypeScript 简称 TS ,既是一门新语言,也是 JS 的一个超集,它是在 JavaScript 的基础上增加了一套类型系统,它支持所有的 JS 语句,为工程化开 ...

  2. 什么是 TypeScript ? 快速上手 TypeScript

    什么是 TypeScript ? TypeScript是一种由微软开发的开源编程语言,它是JavaScript语言的一个超集,支持JavaScript中的所有语法和特性,并在此基础上添加了一些新的特性 ...

  3. 干货! 快速上手typescript的学习笔记 (对比JS的新特性,环境搭建,webpack配置,ts编译配置)

    前提需要有js的基础 文章目录 TypeScript 产生背景 什么是TypeScript? TypeScript增加了什么 TypeScript开发环境搭建 基本类型 编译文件配置 tsconfig ...

  4. TypeScript基础快速上手

    //基础类型 (()=>{//布尔类型console.log("###########布尔类型###########")//基本语法//let 变量名:数据类型 = 值let ...

  5. 在html中写typescript,5分钟上手TypeScript

    让我们使用TypeScript来创建一个简单的Web应用. 安装TypeScript 有两种主要的方式来获取TypeScript工具: 通过npm(Node.js包管理器) 安装Visual Stud ...

  6. typescript map转对象_TypeScript 快速上手及学习笔记 - JoeYoung

    TypeScript是JavaScript类型的超集,它可以编译成纯JavaScript. TypeScript可以在任何浏览器.任何计算机和任何操作系统上运行,并且是开源的. 什么是 TypeScr ...

  7. 【TypeScript】带类型语法的JavaScript

    目录 TypeScript 概述: 为什么一定要在TypeScript中为JS添加类型支持? TypeScript 相比 JS 优势? 配置 TS 开发环境: 编译并运行TS代码: 简化 TS 代码运 ...

  8. Typescript快速上手(js转ts必备)

    接口interface 1.定义一个接口 LabelledValue ,在传参数的时候使用labelledObj:LabelledValue interface LabelledValue {labe ...

  9. typescript vuex_Vue3+TypeScript完整项目上手教程

    作者:TinssonTai https://juejin.im/post/6875713523968802829 一个完整的Vue3+Ts项目,支持.vue和.tsx写法 项目地址:https://g ...

最新文章

  1. 信息系统项目管理师-成本管理知识点
  2. 导师 = advisor + supervisor
  3. python中exception类的_什么是Python异常?Python异常的种类
  4. 观察者模式及c++实现
  5. 网络编程套接字(一)
  6. python中的元类_Python中的元类(metaclass)
  7. Confluence 6 CSS 指南:修改顶部背景
  8. IOT---(8)四大物联网通信技术差异:NB-IoT 、LTEeMTC、LoRa与SigFox
  9. win10系统打开/解压缩文件时出现文件名乱码
  10. 前端原生Html免费模板网站总结(带网址)
  11. 服务器IO-HPSocket
  12. MySQL Front的作者到底何许人也,这款好用的sql可视化软件背后有什么故事。。
  13. 禾穗HERS | 听说妳事业成功都是靠“关系”?
  14. 华为云文件夹服务器,华为云文件夹服务器
  15. IDEA 关于两个分支代码合并的操作
  16. Quick Power
  17. 数字化转型 — 新能源汽车 — 生产制造流程 — Overview
  18. Oracle pctfree 和 pctused 详解
  19. putty远程桌面连接linux,PuTTY + Xming 远程使用 Linux GUI
  20. 傅里叶变换轮廓术Fourier Transform Profilometry(FTP)

热门文章

  1. 超级干货 :如何创造性地应用深度学习视觉模型于非视觉任务(附代码)
  2. 入手查找阅读管理文献 | 来自科研小白的总结
  3. 基于QR分解迭代求解方阵特征值和特征向量
  4. 中软实训总结_中软实训心得
  5. aspx repeater 用法_asp.net中repeater控件用法笔记
  6. java基础 - 线程
  7. C++实现牛顿迭代法求一元二次方程
  8. 转自H3C:测试工具和测试自动化
  9. java 员工轮询值班排班 开发设计(mysql+redis)
  10. es文件浏览器怎么开ftp服务器,es文件浏览器怎么建立ftp服务器