写点什么

TypeScript 1.8 新功能:模块扩充

  • 2016-05-25
  • 本文字数:1232 字

    阅读完需:约 4 分钟

TypeScript 是微软开源的一个 JavaScript 的超集。近日,TypeScript 发布了 1.8 稳定版本。

继上个月 Beta 版本发布 之后,微软项目经理 Bowden Kelly 这次在博文 TypeScript 1.8 版本发布 中宣布:基于新增的代码集成功能(在 TypeScript 项目中使用 JavaScript 代码),最新版本现在“完全支持模块扩充了”。

用 Kelly 的话具体来说,这可以“让用户通过模块扩充来设计更加模块化的组件”,帮助他们扩展已有的模块,并在“引入整个模块或部分模块”上自由选择。这可以通过声明引入附加模块来实现,具体的类型扩展工作则在附加模块中完成。

这里是 Kelly 提供的例子:

复制代码
// 基类所在的文件 scale.ts
export class Scale {
weightOnEarth(mass) {}
}
// 附加模块 advancedScale.ts
import { Scale } from "./scale" ;
// 扩充 Scale 类
declare module "./scale" {
// 通过新的接口描述来扩充引入的基类
interface Scale {
weightOnMoon(mass); // 不是所有人都需要月球上的重力
}
}
Scale.prototype.advancedMethod = /* 具体实现略去 */;
// consumer.ts
import { Scale } from "./scale";
import "./advancedScale";
let scale: Scale;
scale.weightOnMoon(10); // 现在可以用了!

去年九月的 1.6 Beta 版本中,微软首次支持了 React。这次,1.8 稳定版本简化了使用 React 时对 props 类型的声明。

简要地说,现在开发者不再需要显式声明 refkey 或者扩展 React.Props 了,refkey 属性可以在所有组件上表现出正确的类型,同时 ref 也会在无状态函数组件中被正确地禁用。

1.8 版本还改善了联合 / 交叉接口。例如,从 string | string[] 推导 string | T 时,后者会被拆解为 string[]T,于是 string[] 就可以推导为 T 了,如下所示:

复制代码
type Maybe<t> = T | void;
function isDefined<t>(x: Maybe<t>): x is T {
return x !== undefined && x !== null;
}
function isUndefined<t>(x: Maybe<t>): x is void {
return x === undefined || x === null;
}
function getOrElse<t>(x: Maybe<t>, defaultValue: T): T {
return isDefined(x) ? x : defaultValue;
}
function test1(x: Maybe<string>) {
let x1 = getOrElse(x, "Undefined"); // 字符串
let x2 = isDefined(x) ? x : "Undefined"; // 字符串
let x3 = isUndefined(x) ? "Undefined" : x; // 字符串
}
function test2(x: Maybe<number>) {
let x1 = getOrElse(x, -1); // 数值
let x2 = isDefined(x) ? x : -1; // 数值
let x3 = isUndefined(x) ? -1 : x; // 数值
}
</number></string></t></t></t></t></t></t></t>

关于 TypeScript 1.8 带来的种种改善与变化的完整细节,敬请参阅它的 GitHub 页面

查看英文原文: TypeScript 1.8 Brings Module Augmentation Support


感谢丁晓昀对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ @丁晓昀),微信(微信号: InfoQChina )关注我们。

2016-05-25 19:003758

评论

发布
暂无评论
发现更多内容

基于docker的分布式性能测试框架功能验证(二)

FunTester

分布式 性能测试 接口测试 测试框架 测试开发

面试官:你说说一条查询SQL的执行过程

艾小仙

1个月学会Java开发!2021年最新Java面试点梳理

策划Java工程师

Java 程序员 后端

深度学习中的分布式训练

安第斯智能云

人工智能 深度学习

译文 | 四种产品经理成长框架,你是哪一种?

LigaAI

产品经理 产品管理 PM

高亮的架构毕业总结

高亮

架构训练营

复杂多变场景下的Groovy脚本引擎实战

vivo互联网技术

敏捷开发 脚本语言

原来select语句在MySQL中是这样执行的!看完又涨见识了!这回我要碾压面试官!

冰河

MySQL 面试 精通MySQL SELECT查询流程 查询缓存

重磅 | 用友《数字化中台》震撼上市!数智化转型和商业创新实践的企业级经验!

博文视点Broadview

鸿蒙内核之内存调测:动态内存池信息统计

华为云开发者联盟

鸿蒙 内存 动态内存池 内存信息

万字深入HarmonyOS ACE UI框架解析,带你看懂UI渲染流程

科技汇

kafka SpringBoot

Rubble

kafka springboot 8月日更

LeetCode题解:173. 二叉搜索树迭代器,递归,JavaScript,详细注释

Lee Chen

算法 大前端 LeetCode

一文带你搞定AOP切面

华为云开发者联盟

spring aop 切面编程 面向切面编程 切面

分布式性能测试框架用例方案设想(二)

FunTester

分布式 性能测试 接口测试 测试框架 测试开发

PostgreSQL 中如何控制行级安全和列级安全

Qunar技术沙龙

sql postgresql 运维 安全 权限

Springboot 配置文件、隐私数据脱敏的最佳实践(原理+源码)

程序员小富

Java springboot 数据安全 数据脱敏

【LeetCode】加一Java题解

Albert

算法 LeetCode 8月日更

AudioTracker实用封装

Changing Lin

8月日更

知道ThreadLocal吗?一起聊聊到底有啥用

华为云开发者联盟

Java 架构 线程 ThreadLocal 链路

科技融合:Hightopo受邀参加厦门公安科技活动周

一只数据鲸鱼

数据可视化 智慧公安 智能化 安全态势

2021Java春招面试真题:记一次蚂蚁金服Java研发岗的面试经历

策划Java工程师

Java 程序员 后端

架构学习总结

c

架构实战营

高防服务器选择注意的三大方面

九河云安全

Design for failure常见的12种设计思想

架构精进之路

降级 重试 容错 8月日更

Lucene 倒排索引原理

Qunar技术沙龙

数据库 全文检索 lucene 倒排索引 搜索

手撸二叉树之对称二叉树

HelloWorld杰少

算法和数据结构 8月日更

百度爱番番移动端网页秒开实践

百度Geek说

大前端 优化 网页加速 移动端

【Vue2.x 源码学习】第二十四篇 - 异步更新流程

Brave

源码 vue2 8月日更

图分析在吴亦凡事件中的应用场景

6979阿强

图算法 图计算 GraphScope 吴亦凡 一站式图计算平台

TypeScript 1.8 新功能:模块扩充_JavaScript_James Chesters_InfoQ精选文章