TypeScript手册翻译系列8-常见错误与Mixins

常见错误

下面列出了在使用TypeScript语言和编译器期间,经常会遇到的一些常见错误。

"tsc.exe" exited with error code 1.

解决方案: 检查文件编码为UTF-8 - https://typescript.codeplex.com/workitem/1587

external module XYZ cannot be resolved

解决方案:检查模块路径是大小写敏感- https://typescript.codeplex.com/workitem/2134

Mixins

Along with traditional OO hierarchies, another popular way of building up classes from reusable components is to build them by combining simpler partial classes. You may be familiar with the idea of mixins or traits for languages like Scala, and the pattern has also reached some popularity in the JavaScript community.

Mixin sample

In the code below, we show how you can model mixins in TypeScript. After the code, we‘ll break down how it works.

// Disposable Mixinclass Disposable {    isDisposed: boolean;    dispose() {                this.isDisposed = true;    } } 

// Activatable Mixinclass Activatable {    isActive: boolean;    activate() {                this.isActive = true;    }    deactivate() {                this.isActive = false;    }}

class SmartObject implements Disposable, Activatable {    constructor() {        setInterval(() => console.log(this.isActive + " : " + this.isDisposed), 500);    }     interact() {                this.activate();    }        // Disposable    isDisposed: boolean = false;    dispose: () => void;        // Activatable    isActive: boolean = false;    activate: () => void;    deactivate: () => void;}applyMixins(SmartObject, [Disposable, Activatable]) 

var smartObj = new SmartObject();setTimeout(() => smartObj.interact(), 1000); 

////////////////////////////////////////// In your runtime library somewhere////////////////////////////////////////

function applyMixins(derivedCtor: any, baseCtors: any[]) {    baseCtors.forEach(baseCtor => {        Object.getOwnPropertyNames(baseCtor.prototype).forEach(name => {            derivedCtor.prototype[name] = baseCtor.prototype[name];        })    }); }

Understanding the sample

The code sample starts with the two classes that will act is our mixins. You can see each one is focused on a particular activity or capability. We‘ll later mix these together to form a new class from both capabilities.

// Disposable Mixinclass Disposable {    isDisposed: boolean;    dispose() {                this.isDisposed = true;    } }

// Activatable Mixinclass Activatable {    isActive: boolean;    activate() {                this.isActive = true;    }    deactivate() {                this.isActive = false;    }}

Next, we‘ll create the class that will handle the combination of the two mixins. Let‘s look at this in more detail to see how it does this:

class SmartObject implements Disposable, Activatable {

The first thing you may notice in the above is that instead of using ‘extends‘, we use ‘implements‘. This treats the classes as interfaces, and only uses the types behind Disposable and Activatable rather than the implementation. This means that we‘ll have to provide the implementation in class. Except, that‘s exactly what we want to avoid by using mixins.

To satisfy this requirement, we create stand-in properties and their types for the members that will come from our mixins. This satisfies the compiler that these members will be available at runtime. This lets us still get the benefit of the mixins, albeit with a some bookkeeping overhead.

// DisposableisDisposed: boolean = false;dispose: () => void;// ActivatableisActive: boolean = false;activate: () => void;deactivate: () => void;

Finally, we mix our mixins into the class, creating the full implementation.

applyMixins(SmartObject, [Disposable, Activatable])

Lastly, we create a helper function that will do the mixing for us. This will run through the properties of each of the mixins and copy them over to the target of the mixins, filling out the stand-in properties with their implementations.

function applyMixins(derivedCtor: any, baseCtors: any[]) {    baseCtors.forEach(baseCtor => {        Object.getOwnPropertyNames(baseCtor.prototype).forEach(name => {            derivedCtor.prototype[name] = baseCtor.prototype[name];        })    }); }

参考资料

[1] http://www.typescriptlang.org/Handbook#common-errors

[2] TypeScript系列1-简介及版本新特性, http://my.oschina.net/1pei/blog/493012

[3] TypeScript系列2-手册-基础类型, http://my.oschina.net/1pei/blog/493181

[4] TypeScript系列3-手册-接口, http://my.oschina.net/1pei/blog/493388

[5] TypeScript系列4-手册-类, http://my.oschina.net/1pei/blog/493539

[6] TypeScript系列5-手册-模块, http://my.oschina.net/1pei/blog/495948

[7] TypeScript系列6-手册-函数, http://my.oschina.net/1pei/blog/501273

[8] TypeScript手册翻译系列7-泛型, http://my.oschina.net/1pei/blog/513483

时间: 2024-12-28 21:47:22

TypeScript手册翻译系列8-常见错误与Mixins的相关文章

TypeScript手册翻译系列12-编写.d.ts文件

Writing .d.ts files When using an external JavaScript library, or new host API, you'll need to use a declaration file (.d.ts) to describe the shape of that library. This guide covers a few high-level concepts specific to writing definition files, the

TypeScript手册翻译系列7-泛型

泛型(Generics) 软件工程的一个主要部分是建立不仅有良好定义和一致性APIs,而且是可重用的组件(components).使用今天数据以及明日数据的组件才能够最为灵活地构建大规模软件系统. 在类似C#和Java等语言中,工具箱中创建可重用组件的一个主要工具就是泛型(generics),即能够创建可以使用各种类型而不是单一类型的组件.这使得用户可以用自己的类型来调用这些组件. Hello World of Generics 我们先来做一个泛型的"hello world":iden

RDLC系列之四 常见错误

解决 RDLC 报表自动分页表头显示问题 原文:http://www.th7.cn/Program/net/201207/85445.shtml RDLC是用XML来描述一个报表相关的一切,只需要在<TablixMember>节点添加<RepeatOnNewPage>true</RepeatOnNewPage>子节点就可以,并设定值为true. 有些朋友在VS环境中无法打开XML编辑方式,这里我提示一下,你可以去工程目录下用记事本打开扩展名为RDLC的文件,也可以直接在

LAMP系列之PHP编译过程中常见错误信息的解决方法

LAMP系列之PHP编译过程中常见错误信息的解决方法 在CentOS编译PHP5的时候有时会遇到以下的一些错误信息,基本上都可以通过yum安装相应的库来解决.以下是具体的一些解决办法: ******************************************************************************* checking for BZip2 support- yes checking  for BZip2 in default path- not foun

6.Swift教程翻译系列——Swift集合类型

英文版PDF下载地址http://download.csdn.net/detail/tsingheng/7480427 Swift提供数组和字典两种集合类型,用来存储许多值的情况.数组有序的存储一组相同类型的值.字典也存储一组相同类型的值但是是无序的,字典中存储的值可以通过一个唯一的标识(也就是Key)来查找. 在Swift中,数组和字典总是清楚自己能存储的值的类型和key的类型.也就是说你不会错误的把其他不对应的类型存进数组或者字典.所以你也能确定从数组或者字典中取出来的值的类型肯定也不会错了

Java垃圾回收手册翻译 - 什么是垃圾回收

Java垃圾回收手册翻译 - 什么是垃圾回收 初看之下,垃圾回收应该要做其名称之事 - 找到和丢掉垃圾.然而事实上它正好做着相反的事,垃圾回收会记录所有仍在使用中的对象,然后将其他标记为垃圾.谨记这点,我们开始挖掘更多Java虚拟机如何实现被称为垃圾回收的自动化内存回收过程的细节. 为了避免一头扎进细节,我们从头开始,解释垃圾回收的一般性质以及核心概念和方法. 免责声明:本手册关注于Oracle Hotspot和OpenJDK的表现,其他运行时甚至其他虚拟机,比如jRockit或IBM J9,会

Swift编程语言(中文版)官方手册翻译(第一部分)

独立翻译,进度会比较慢.等不及的可以看CocoaChina翻译小组,他们也正在组织翻译,而且人手众多,相信会提前很多完成翻译.当然质量就见仁见智了.原文可以在iTunes免费下载 目前进度 4 JUN 2014:6.5 % 前言 今天Apple发布了新的编程语言Swift,也提供了一本将近400页的 The Swift Programming Language(Swift编程语言).虽然我没有开发者账号,没法实际上机练习Swift代码,但这不影响我阅读这本书,以及用铅笔在纸上运行这些小程序.Ap

Python程序员的10个常见错误(转)

add by zhj:虽然学Python也有两年了,但这些问题的确容易犯,看来对Python的理解还有些地方不深入.先转了,有时间再好好看 译文:http://blog.jobbole.com/68256/ 本文由 伯乐在线 - datorhjaelten 翻译.未经许可,禁止转载!英文出处:toptal.欢迎加入翻译小组. 关于Python Python是一门解释性的,面向对象的,并具有动态语义的高级编程语言.它高级的内置数据结构,结合其动态类型和动态绑定的特性,使得它在快速应用程序开发(Ra

ios 学习总结day01关于UIview和IBAction 常见错误

UIKit - 创建和管理应用程序的用户界面 QuartzCore -提供动画特效以及通过硬件进行渲染的能力 CoreGraphics -提供2D绘制的基于C的API CoreLocation -使用GPS和WIFI获取位置信息 MapKit -为应用程序提供内嵌地图的接口 AVFoundation – 音频处理 iOS开发种常见的问题 day 01 UIview 就是屏幕上可以看得见的摸得到的 比如屏幕上的按钮.文字.图片 一般翻译叫做视图\控件\组件 父控件与子控件之间的关系 父控件中容纳好