以下是我总结的笔记,只涉及语法部分,有错漏请指正。
PS.我曾经用正则表达式写过一个 AS3 转 TypeScript 的在线转换器
基本类型
基础类型只有这么几种,与 AS3 对比
TypeScript | ActionScript3 |
---|
number | Number |
string | String |
boolean(0.8 以前为 bool) | Boolean |
any | * |
undefined | undefined |
null | null |
任意类型
ActionScript3 :
TypeScript:
变量修饰符
TS 类似 AS3 但不用写"var" , 没有 protected (未来也许会添加) TypeScript 1.3 加入了 protected 关键字,与 AS3 用法一致,默认为 public。
ActionScript3 :
TypeScript:
变量类型转换
ActionScript3 :
TypeScript :
发现使用 any 类型会编译通过:
用 instanceof 判断类型
数组
Typescript 数组的写法比 AS3 漂亮很多
ActionScript3 :
TypeScript :
二维数组
Object Types
当 AS3 调用这样一个函数时,会有下面一个问题。
ActionScript3 :
此时编译器并不知道 rect 这个 Object 里到底有没有 width 和 height,只能等到 runtime 时才会知道。
TypeScript 引入Object Types 解决这一问题,可以指定 Object 参数的具体内容,相当于让 Object 参数实现了 interface
此时如果调用 CalculateArea({w:123,h:456});
编译器不会通过。
Object Types 还支持”?"表示可选参数
可以这样声明一个 Object
ActionScript3 :
TypeScript 可以指定 Function 需要的参数和返回值类型,叫做函数签名,所以变成了这样
eg.指定 callback 函数为 string 输入,any 输出。
TypeScript 这样的语法虽然使 Function 更清晰了,但也带来麻烦,比如一个简单的输入输出都是 string 的函数就要写好长不易阅读
所以引入了 函数接口
函数接口
上边很长的都可以这么写了
可选参数加"?"
rest 参数 ...paramName[:paramType]
Arrow Function
关于 this 作用域的问题,AS1 时代经常用到的一个技巧:
TypeScript 把这个技巧封装到语言里了,叫Arrow Function
语法格式为 ()=>{}
,例子:
TypeScript:
编译后的 JavaScript 跟上边的一样
网上找到的一个例子,
语法中用了(e)=> ,将 e 传给后边的函数,并且省略了 e 的括号,会编译成这样:
这里有篇教程详细解释了这个语法:
http://www.codebelt.com/typescript/arrow-function-typescript-tutorial/
类相关的
TypeScript 中的 module 相当于 ActionScript3 中的 Package
TypeScript 中构造函数的函数名用constructor ,而不用类名。
TypeScript:
调用 Static 方法
module 原理
module 始终是要编译成 JS 代码的,写一个简单的 module 看一下原理:
编译后的 JS 代码
据说这是 js 界很流行的写法,叫做JavaScript module pattern
函数重载
AS3 和 JS 都是不支持函数重载的,TypeScript 以一种鸡肋的方式支持着。
先写一些同名的函数声明,最后在一个同名函数里写出实现(要自己判断参数类型):
TypeScript:
最终会编译成一个 JS 方法:
JavaScript:
2014/12/07 补充 : js 判断类型也是个很大的坑,详见 http://tobyho.com/2011/01/28/checking-types-in-javascript/
TypeScript 允许多个类在同一个文件里,但如果类与类在不同的文件,需要这种写法,相当于 AS3 的 import
override 方法子类不需要写关键字,直接同名方法即可 ,可调用 super.xxx()
Enum
TypeScript 支持 enum 关键字
生成对应的 js