日常项目开发使用typescript

简介: 本文适合日常项目开发使用到TS、以及对TS感兴趣的小伙伴阅读。

一、前言


本文基于开源项目:

https://github.com/microsoft/TypeScript

https://www.typescriptlang.org/docs/

 

前阵子有小伙伴跟广东靓仔说自己在日常项目开发过程中有使用typescript,不过仅仅只是使用了基础的类型声明,有些时候项目时间赶甚至写了很多any。    


这里广东靓仔整理了一些日常项目开发使用typescript的小技巧,希望对小伙伴有所帮助。


二、TS基础知识


   Typescript的基础知识我们要牢牢掌握,有一句老话,楼房建得高不高,地基很重要。


  Typescript的基础类型基本都是小写字母开头的(除了Array),很多小伙伴忽略了这点。相信有小伙伴有使用过Number ,TS指导建议我们不要这样使用。我们都知道在JavaScript代码中几乎从不使用的非原始装箱对象。


/* WRONG */ 
function reverse(s: String): String; 
请使用类型数字,字符串和布尔值。
/* OK */ 
function reverse(s: string): string; 
/* OK */ 
let decLiteral: number = 6;


基础类型:

1、boolean

2、number

3、string

4、[]、Array<>


// 在元素类型后面接上[],表示由此类型元素组成的一个数组
let list: number[] = [1, 2, 3];
// 数组泛型,Array<元素类型>
let list: Array<number> = [1, 2, 3];


5、Tuple

// 声明一个元组
let x: [string, number];
// 正确的初始化
x = ['广东', 10]; // OK
// 错误的初始化
x = [10, '靓仔']; // Error


6、enum

const enum Directions {
  Up,
  Down,
  Left,
  Right
}
let directions = [Directions.Up, Directions.Down, Directions.Left, Directions.Right]


7、any ---- 尽量不使用

8、void

9、undefined和null

10、never

function error(message: string): never {
    throw new Error(message);
}


11、类型断言:<>、as

类型断言好比其它语言里的类型转换,但是不进行特殊的数据检查和解构

温馨提示我们定义变量的时候,尽量使用let


三、tsconfig.json 字段说明


tsconfig.json 所包含的属性并不多,只有 7 个。  

tsconfig可以到http://json.schemastore.org/tsconfig查看,下面我们重点讲讲字段。


files: 数组类型,用于表示由 ts 管理的文件的具体文件路径

exclude: 数组类型,用于表示 ts 排除的文件(2.0 以上支持 Glob)

include: 数组类型,用于表示 ts 管理的文件(2.0 以上)

compileOnSave: 布尔类型,用于 IDE 保存时是否生成编译后的文件

extends: 字符串类型,用于继承 ts 配置,2.1 版本后支持

compilerOptions: 对象类型,设置编译的选项,不设置则使用默认配置,配置项比较多,后面再列

typeAcquisition: 对象类型,设置自动引入库类型定义文件(.d.ts)相关,该对象下面有 3 个子属性分别是:

   enable: 布尔类型,是否开启自动引入库类型定义文件(.d.ts),默认 false

   include: 数组类型,允许自动引入的库名,如:["jquery", "lodash"]

   exculde: 数组类型,排除的库名


如不设定 filesinclude,ts 默认是 exclude 以外的所有的以.ts .tsx 结尾的文件。如果,同时设置 files 的优先级最高,exclude 次之,include 最低。

上面都是文件相关的,编译相关的都是靠 compilerOptions 设置的,接着就来看一看。


属性名

值类型

默认值

描述

allowJs boolean false 编译时,允许有 js 文件
baseUrl string
与 path 一同定义模块查找的路径
declaration boolean false 生成 .d.ts 定义文件
jsx string "preserve" jsx 的编译方式
noImplicitAny boolean false 不允许隐式 any,如果true,函数的形参必须带类型,如果叫不出class名的js对象,那就得any,比如(d:any)=>{}

如果false,函数的样子更像js  (d)=>{

............

............一般情况下,tsconfig.json 文件只需配置 compilerOptions 部分。


{
  "compilerOptions": {
    "allowSyntheticDefaultImports": true, // 允许引入没有默认导出的模块
    "module": "es2015",
    "removeComments": true,
    "preserveConstEnums": true,
    "sourceMap": true,
    "strict": true,
    "target": "es5",
    "lib": [
      "dom",
      "es5",
      "es2015"
    ]
  }
}


allowSyntheticDefaultImports 是使用 vue 必须的,而设置 module 则是让模块交由 webpack 处理,从而可以使用 webpack2 的摇树。另外,加上allowJs,这样就可以一点点将现有的 js 代码转换为 ts 代码了。


如果,在 webpack 中设置过 resolve -> alias,那么,在 ts config 中也需要通过 baseUrl + path 的方式来定义模块查找的方式。


<a name="tslint"></a>


四、ts使用小技巧


1.注释

我们平时开发过程可以通过 /** */ 形式的注释可以给 TS 类型做标记提示,这样子编辑器会有更好的提示。

/** This is a cool guy. */
interface Person {
  /** This is name. */
  name: string,
}
const p: Person = {
    name: 'cool'
}


当我们鼠标移动到person会有tooltip,一眼就看出来是什么了。

image.png


2.接口继承


和类一样,接口也是可以相互继承。让我们能够从一个接口里复制成员到另一个接口里,可以更灵活地将接口分割到可重用的模块里。


interface Shape {
    color: string;
}
interface Square extends Shape {
    sideLength: number;
}
let square = <Square>{};
square.color = "blue";
square.sideLength = 10;


一个接口可以继承多个接口,创建出多个接口的合成接口。

interface Shape {
    color: string;
}
interface PenStroke {
    penWidth: number;
}
interface Square extends Shape, PenStroke {
    sideLength: number;
}
let square = <Square>{};
square.color = "blue";
square.sideLength = 10;
square.penWidth = 5.0;


3interface & type

TypeScript 定义类型的两种方式:接口(interface)和 类型别名(type alias)。

比如下面的 Interface 和 Type alias 的例子中,除了语法,意思是一样的:


Interface

interface Place {
  x: number;
  y: number;
}
interface SetPlace {
  (x: number, y: number): void;
}


Type alias

type Place = {
  x: number;
  y: number;
};
type SetPlace = (x: number, y: number) => void;

而且两者都可以扩展,但是语法有所不同。此外,请注意,接口和类型别名不是互斥的。接口可以扩展类型别名,反之亦然。


4. typeof

typeof可以获取一个对象/实例的类型

typeof 只能用在具体的对象上,这与 js 中的 typeof 是一致的,并且它会根据左侧值自动决定应该执行哪种行为。


interface Opt {
  timeout: number
}
const defaultOption: Opt = {
  timeout: 500
}


有时候可以反过来:

const defaultOption = {
  timeout: 500
}
type Opt = typeof defaultOption


5. 运算符


非空断言运算符 !

这个运算符可以用在变量名或者函数名之后,用来强调对应的元素是非 null|undefined 的。

function onClick(callback?: () => void) {
  callback!();  // 参数是可选入参,加了这个感叹号!之后,TS编译不报错
}


   这个符号的场景,特别适用于我们已经明确知道不会返回空值的场景,从而减少冗余的代码判断,如 React 的 Ref。

function Demo(): JSX.Elememt {
  const divRef = useRef<HTMLDivElement>();
  useEffect(() => {
    divRef.current!.scrollIntoView(); 
    // 当组件Mount后才会触发useEffect,故current一定是有值的
  }, []);
  return <div ref={divRef}>Demo</div>
}


可选链运算符 ?.

?.这个是开发者最需要的运行时(当然编译时也有效)的非空判断。

obj?.prop
obj?.[index]
func?.(args)

?.用来判断左侧的表达式是否是 null | undefined,如果是则会停止表达式运行,可以减少我们大量的&&运算。

比如我们写出a?.b时,编译器会自动生成如下代码

a === null || a === void 0
 ?
  void 0
 :
  a.b;

这里涉及到一个小知识点:undefined这个值在非严格模式下会被重新赋值,使用void 0必定返回真正的 undefined。


空值合并运算符 ??

??与||的功能是相似的,区别在于??在左侧表达式结果为 null 或者 undefined 时,才会返回右侧表达式。

比如我们书写了let b = a ?? 10,生成的代码如下:

let b = a !== null && a !== void 0
 ?
  a
 :
  10;

而 || 表达式,大家知道的,则对 false、''、NaN、0 等逻辑空值也会生效,不适于我们做对参数的合并。


数字分隔符_

let num:number = 1_2_345.6_78_9

_可以用来对长数字做任意的分隔,主要设计是为了便于数字的阅读,编译出来的代码是没有下划线的。


五、总结


   typescript我们可以在Vue中引入,广东靓仔之前写过Vue+ts+vuex的相关文章,我们可以使用vue 支持 jsx,进而使用render jsx。当然我们也可以在React中引typescript    总体来说ts其实对于规模较大的前端团队来说,还是很有必要的。

相关文章
|
算法 Java 数据安全/隐私保护
Java:Hutool工具箱之Hutool-crypto加密解密
Java:Hutool工具箱之Hutool-crypto加密解密
3703 0
Java:Hutool工具箱之Hutool-crypto加密解密
|
6月前
|
前端开发 开发工具 git
Git报错处理:解决git commit时的lint-staged错误提示。
极好的,你对Git的lint-staged出了一个令人头疼的问题。让我们一起钻研一下,找到一种方法来解决一切。 首先,我们要确定你是在做什么操作时候遇到了问题。lint-staged通常在我们运行 git commit 时启动,它做的工作是在你提交之前运行一些指定的命令检查你的代码。当lint-staged报错,多半是因为检查未通过,或者它试图运行的命令存在问题。 让我们以一种图解的方式来描绘一下这个过程,就像canvas上的画面那样。git正在温柔的将你的修改捆绑起来,准备提交。突然,lint-staged走了出来,并开始盘问着Git,寻找可能的错误。如果lint-staged找到了什么
736 24
|
6月前
|
机器学习/深度学习 人工智能 运维
AI为网络可靠性加“稳”——从断网烦恼到智能运维
AI为网络可靠性加“稳”——从断网烦恼到智能运维
281 2
|
5月前
|
运维 安全 网络安全
等保测评全面解析
等保测评是依据国家信息安全等级保护制度,对信息系统安全保护状况进行检测评估的活动。其目标是确保信息系统在各阶段符合安全等级要求,保障系统保密性、完整性和可用性。测评涵盖技术与管理两方面:技术层面包括物理环境、网络通信、设备计算及应用数据安全;管理层面涉及制度、机构、人员及建设运维管理。测评流程分为准备、方案设计、现场测评和报告编制四个阶段。实践中需做好测评前准备、测评中配合以及测评后整改优化,以持续提升信息安全水平。
437 0
|
7月前
|
缓存 边缘计算 安全
阿里云CDN:全球加速网络的实践创新与价值解析
在数字化浪潮下,用户体验成为企业竞争力的核心。阿里云CDN凭借技术创新与全球化布局,提供高效稳定的加速解决方案。其三层优化体系(智能调度、缓存策略、安全防护)确保低延迟和高命中率,覆盖2800+全球节点,支持电商、教育、游戏等行业,帮助企业节省带宽成本,提升加载速度和安全性。未来,阿里云CDN将继续引领内容分发的行业标准。
426 7
|
Linux SoC
【linux】【设备树】中断描述
【linux】【设备树】中断描述
214 0
|
10月前
|
Python
阿里云百炼大模型生成贪吃蛇小游戏
阿里云百炼大模型生成的贪吃蛇小游戏增加了背景音乐功能。通过Pygame的`mixer`模块,实现背景音乐的加载和播放。关键步骤包括:1. 安装Pygame;2. 准备音乐文件;3. 修改代码以初始化混音器并加载音乐。游戏开始时自动播放背景音乐,支持无限循环。此外,还可以根据需要调整游戏速度、难度及添加更多音效。
201 13
阿里云百炼大模型生成贪吃蛇小游戏
|
9月前
|
JSON 数据挖掘 API
京东店铺所有商品 API 接口系列(京东 API)
京东店铺所有商品API接口用于获取指定店铺的全面商品信息,包括基本属性、价格、库存、销售数据等。前期需仔细研读接口文档,掌握请求地址、参数格式及频率限制。接口支持分页和筛选参数,返回JSON格式数据。Python示例中使用`requests`库发送HTTP请求并处理返回数据。该API适用于竞品分析、商品管理工具开发、市场调研及价格监测等场景,助力电商从业者优化运营策略。
|
10月前
|
敏捷开发 存储 数据可视化
探索:6 款办公软件如何变革设计团队协作新潮流?
本文深入介绍了6款适合全J人软件设计开发团队的可视化协作软件,包括国内的板栗看板和5款国外的小众软件:Figma Jam、InSightful、Backlog、Taiga和Wekan。这些软件各自拥有独特优势,如板栗看板的任务可视化、Figma Jam的创意空间构建、InSightful的工作时长分析等,旨在提升团队协作效率,助力项目成功推进。
168 5
|
11月前
|
数据可视化
制造业短周期订单交付如何提效?
短周期订单交付对制造业提出更高要求,信息不畅、任务混乱、进度难控等问题成为企业挑战。本文分析了常见痛点,并介绍如何利用Leangoo看板工具,通过可视化管理、多部门协作、进度把控和灵活应对机制,提高团队效率,快速响应客户需求,助力制造企业在高压环境下实现高效交付。