Do’s and Don’ts

永远不要使用类型 Number、String、Boolean、Symbol 或 Object. 这些类型是指几乎从未在 JavaScript 代码中正确使用的非原始装箱对象。

下列用法不推荐:

function reverse(s: String): String;

应该使用下列用法:

function reverse(s: string): string;

any

除非您正在将 JavaScript 项目迁移到 TypeScript,否则不要使用 any 作为类型。 编译器有效地将 any 视为“请关闭此内容的类型检查”。 它类似于在变量的每个用法周围放置@ts-ignore 注释。 当您第一次将 JavaScript 项目迁移到 TypeScript 时,这会非常有用,因为您可以将尚未迁移的内容的类型设置为任何类型,但是在完整的 TypeScript 项目中,您将禁用对程序的任何部分进行类型检查 用它。

如果您不知道要接受什么类型,或者当您想接受任何东西时,因为您会盲目地传递它而不与它交互,则可以使用 unknown.

Return Types of Callbacks

不要将返回类型 any 用于其值将被忽略的回调。下列用法不推荐:

function fn(x: () => any) {x();
}

正确做法:使用类型 void 替代 any:

function fn(x: () => void) {x();
}

原因:使用 void 更安全,因为它可以防止您以未经检查的方式意外使用 x 的返回值。

function fn(x: () => void) {var k = x(); // oops! meant to do something elsek.doSomething(); // error, but would be OK if the return type had been 'any'
}

Return Types of Callbacks

尽量避免在回调函数里定义 optional 参数,除非你觉得实在有必要。

interface Fetcher {getObject(done: (data: any, elapsedTime?: number) => void): void;
}

这有一个非常具体的含义:done 回调可能用 1 个参数调用,也可能用 2 个参数调用。 作者可能打算说回调可能不关心 elapsedTime 参数,但是没有必要使参数成为可选参数来实现这一点——提供接受更少参数的回调总是合法的。

重载和回调函数

不要编写仅在回调数量上有所不同的单独重载:

declare function beforeAll(action: () => void, timeout?: number): void;
declare function beforeAll(action: (done: DoneFn) => void,timeout?: number
): void;

请使用最大数量编写单个重载:

declare function beforeAll(action: (done: DoneFn) => void,timeout?: number
): void;

函数重载的定义顺序

不要在更具体的重载之前放置更一般的重载:

declare function fn(x: any): any;
declare function fn(x: HTMLElement): number;
declare function fn(x: HTMLDivElement): string;
var myElem: HTMLDivElement;
var x = fn(myElem); // x: any, wat?

正确做法:从具体到一般

declare function fn(x: HTMLDivElement): string;
declare function fn(x: HTMLElement): number;
declare function fn(x: any): any;
var myElem: HTMLDivElement;
var x = fn(myElem); // x: string, :)

原因:

TypeScript 在解析函数调用时选择第一个匹配的重载。 当较早的重载比较晚的重载“更通用”时,较晚的重载实际上是隐藏的并且无法调用。

使用可选参数

不要写几个只在尾随参数上不同的重载:

/* WRONG */
interface Example {diff(one: string): number;diff(one: string, two: string): number;diff(one: string, two: string, three: boolean): number;
}

正确做法:尽量使用可选参数:

interface Example {diff(one: string, two?: string, three?: boolean): number;
}

使用联合类型

不要编写仅在一个参数位置上因类型不同而不同的重载:

/* WRONG */
interface Moment {utcOffset(): number;utcOffset(b: number): Moment;utcOffset(b: string): Moment;
}

尽可能使用联合类型:

/* OK */
interface Moment {utcOffset(): number;utcOffset(b: number | string): Moment;
}

TypeScript 书写 .d.ts 文件的一些注意事项相关推荐

  1. TypeScript 里 .d.ts 文件的用处

    StackOverflow 讨论 "d.ts"文件用于为 TypeScript 提供有关用 JavaScript 编写的 API 的类型信息.这个想法是你正在使用像jQuery 或 ...

  2. php 得到 ts文件,获取TypeScript声明文件.d.ts步骤详解

    这次给大家带来获取TypeScript声明文件.d.ts步骤详解,获取TypeScript声明文件.d.ts的注意事项有哪些,下面就是实战案例,一起来看一下. 一.TypeScript的声明文件就像C ...

  3. TypeScript基础 ts文件的创建与执行

    创建 1.新建一个文件夹 2.用vscode打开 3.在文件夹下新建一个hello.ts的文件 执行 在ts文件中输入代码console.log('111') 因为node.js不能直接读取ts代码 ...

  4. ieda ts文件报错_Java开发平台IntelliJ IDEA教程:开发,运行和调试TypeScript源代码-IntelliJ IDEA系列教程:-慧都网...

    Java开发平台开发,运行和调试TypeScript源代码 IntelliJ IDEA是Java语言开发的集成环境,IntelliJ在业界被公认为优秀的Java开发工具之一,尤其在智能代码助手.代码自 ...

  5. JavaScript 和 TypeScript 交叉口 —— 类型定义文件(*.d.ts)

    在 <从 JavaScript 到 TypeScript 系列> 文章我们已经学习了 TypeScript 相关的知识. TypeScript 的核心在于静态类型,我们在编写 TS 的时候 ...

  6. Cocos Creator TypeScript 中使用ProtoBuf(利用工具把proto文件生成对应的js文件以及ts文件)

    我是一枚刚入坑cocos的小白o(╯□╰)o 开发环境:Cocos Creator 1.9   (需要安装Node.js,使用npm命令) 在网上找了很久都是讲的protobuf.js的用法,但是没有 ...

  7. TypeScript 初体验:第一个 TS 文件

    步骤 1. 创建ts文件: ① 在桌面中创建文件夹:code. ② 在文件夹上点击鼠标右键,然后点击 Open With Code(用VSCode打开文件夹). ③ 在 VSCode 中新建ts文件: ...

  8. TypeScript 里 tsconfig.json 文件的作用

    What is a tsconfig.json 目录中存在 tsconfig.json 文件表明该目录是 TypeScript 项目的根目录. tsconfig.json 文件指定了编译项目所需的根文 ...

  9. 在vscode中用tsc编译ts文件的时候报错,tsc : 无法加载文件,因为在此系统上禁止运行脚本;SecurityError

    一.问题描述: 1. TypeScript安装成功,在C盘的Administrator目录下,运行 tsc -v 也可看到TypeScript的版本. 2. 但在vscode中的时候运行tsc 编译t ...

最新文章

  1. 语义分割--End-to-End Instance Segmentation with Recurrent Attention
  2. boost::spirit::classic相关的测试程序
  3. 在OUTLOOK或OWA中查看邮件的SCL级别(转)
  4. idea中隐藏.idea文件夹和.iml文件
  5. Shell 判断文件或文件夹是否存在(不存在则创建)
  6. Eclipse的JavaWeb项目导入到IntelliJ IDEA 并且配置Tomcat
  7. GaussDB(for MySQL)如何在存储架构设计上做到高可靠、高可用
  8. leaflet自定标签json_Windows Terminal更新后,自定义配置失效?快捷键无法使用?
  9. LeetCode 49. Group Anagrams
  10. Word2Vec在中文的应用
  11. asp.net网站后台退出后,点后退按钮仍能进,如何安全退出
  12. 《Redis设计与实现》读书笔记
  13. 愿你出走半生,归来仍是少年——2017年半年总结(下)
  14. NW.JS 客户端开发入坑指南
  15. 全球裁员潮,Salesforce职业能否抵御风险?
  16. 平面设计之CDR文本绘图工具总结
  17. python数据可视化第七节(绘制3D图表和统计地图)
  18. 关于拖延症的一些小思考
  19. Erlang JAM二三话
  20. 新冠病毒是人造?科学解释为何阴谋论错得离谱

热门文章

  1. MySQL学习笔记(二):MyISAM 存储引擎
  2. 【Altium Designer】DatabaseLib的使用方法
  3. 2012年第一篇博文——致谢:2011年中国IT十大杰出博客获奖感言
  4. java 多线程下载文件并实时计算下载百分比(断点续传)
  5. 已经了关联到svn的文件类型,如何添加到 ignore
  6. Linux搭建oracle数据库
  7. EXCEL 打开 csv乱码问题
  8. Request.Params用法
  9. 微信支付接口开发过程
  10. 把代码push到github所遇到的问题