commit
a5e40d0cab
@ -22,7 +22,9 @@ Typescript中的声明会创建以下三种实体之一:命名空间,类型
|
||||
|------------------|:---------:|:----:|:-----:|
|
||||
| Namespace | X | | X |
|
||||
| Class | | X | X |
|
||||
| Enum | | X | X |
|
||||
| Interface | | X | |
|
||||
| Type Alias | | X | |
|
||||
| Function | | | X |
|
||||
| Variable | | | X |
|
||||
|
||||
@ -118,7 +120,7 @@ namespace Animals {
|
||||
```
|
||||
|
||||
除了这些合并外,你还需要了解非导出成员是如何处理的。
|
||||
非导出成员仅在其原始存在于的命名空间(未合并的)之内可见。这就是说合并之后,从其它命名空间合并进来的成员无法访问非导出成员了。
|
||||
非导出成员仅在其原始存在于的命名空间(未合并的)之内可见。这就是说合并之后,从其它命名空间合并进来的成员无法访问非导出成员。
|
||||
|
||||
下例提供了更清晰的说明:
|
||||
|
||||
|
@ -6,7 +6,7 @@
|
||||
|
||||
## `for..of` 语句
|
||||
|
||||
`for..of`会遍历可迭代的对象,调用对象上的`Symbol.iterator`属性。
|
||||
`for..of`会遍历可迭代的对象,调用对象上的`Symbol.iterator`方法。
|
||||
下面是在数组上使用`for..of`的简单例子:
|
||||
|
||||
```ts
|
||||
@ -19,7 +19,7 @@ for (let entry of someArray) {
|
||||
|
||||
### `for..of` vs. `for..in` 语句
|
||||
|
||||
`for..of`和`for..in`均可迭代一个列表;但是用于迭代的值却不同,`for..in`迭代的是对象的*键*的列表,而`for..of`则迭代对象数字键对应的值。
|
||||
`for..of`和`for..in`均可迭代一个列表;但是用于迭代的值却不同,`for..in`迭代的是对象的 *键* 的列表,而`for..of`则迭代对象的键对应的值。
|
||||
|
||||
下面的例子展示了两者之间的区别:
|
||||
|
||||
@ -34,8 +34,8 @@ for (let i of list) {
|
||||
console.log(i); // "4", "5", "6"
|
||||
```
|
||||
|
||||
别一个区别是`for..in`可以操作任何对象;它提供了查看对象属性的一种方法。
|
||||
但是`for..in`关注于迭代对象的值。内置对象`Map`和`Set`已经实现了`Symbol.iterator`属性,让我们可以访问它们保存的值。
|
||||
另一个区别是`for..in`可以操作任何对象;它提供了查看对象属性的一种方法。
|
||||
但是`for..of`关注于迭代对象的值。内置对象`Map`和`Set`已经实现了`Symbol.iterator`方法,让我们可以访问它们保存的值。
|
||||
|
||||
```ts
|
||||
let pets = new Set(["Cat", "Dog", "Hamster"]);
|
||||
@ -78,4 +78,4 @@ for (var _i = 0; _i < numbers.length; _i++) {
|
||||
|
||||
#### 目标为 ECMAScript 2015 或更高
|
||||
|
||||
当目标为兼容ECMAScipt 2015的引擎时,编译器会生成相应引擎的`for..of`内置迭代器实现方式。
|
||||
当目标为兼容ECMAScipt 2015的引擎时,编译器会生成相应引擎的`for..of`内置迭代器实现方式。
|
||||
|
@ -26,7 +26,7 @@ TypeScript的结构性子类型是根据JavaScript代码的典型写法来设计
|
||||
|
||||
## 关于可靠性的注意事项
|
||||
|
||||
TypeScript的类型系统允许一些在编译阶段无法否认其安全性的操作。当一个类型系统具此属性时,被当做是“不可靠”的。TypeScript允许这种不可靠行为的发生是经过仔细考虑的。通过这篇文章,我们会解释什么时候会发生这种情况和其有利的一面。
|
||||
TypeScript的类型系统允许某些在编译阶段无法确认其安全性的操作。当一个类型系统具此属性时,被当做是“不可靠”的。TypeScript允许这种不可靠行为的发生是经过仔细考虑的。通过这篇文章,我们会解释什么时候会发生这种情况和其有利的一面。
|
||||
|
||||
# 开始
|
||||
|
||||
|
@ -7,21 +7,21 @@
|
||||
|
||||
## 流程
|
||||
|
||||
最好从程序库的文档开始写.d.ts文件,而不是代码。
|
||||
最好从程序库的文档而不是代码开始写.d.ts文件。
|
||||
这样保证不会被具体实现所干扰,而且相比于JS代码更易读。
|
||||
下面的例子会假设你正在参照文档写声明文件。
|
||||
|
||||
## 命名空间
|
||||
|
||||
当定义接口(例如:“options”对象),你会选择是否将这些类型放进命名空间里。
|
||||
这主要是靠主观判断 -- 使用的人主要是用这些类型声明变量和参数,并且类型命名不会引起命名冲突,放在全局命名空间里更好。
|
||||
这主要是靠主观判断 -- 如果使用的人主要是用这些类型来声明变量和参数,并且类型命名不会引起命名冲突,则放在全局命名空间里更好。
|
||||
如果类型不是被直接使用,或者没法起一个唯一的名字的话,就使用命名空间来避免与其它类型发生冲突。
|
||||
|
||||
## 回调函数
|
||||
|
||||
许多JavaScript库接收一个函数做为参数,之后传入已知的参数来调用它。
|
||||
当为这些类型与函数签名的时候,不要把这个参数标记成可选参数。
|
||||
正确的思考方式是“会提供什么样的参数?”,不是“会使用到什么样的参数?”。
|
||||
当用这些类型为函数签名的时候,不要把这些参数标记成可选参数。
|
||||
正确的思考方式是“(调用者)会提供什么样的参数?”,不是“(函数)会使用到什么样的参数?”。
|
||||
TypeScript 0.9.7+不会强制这种可选参数的使用,参数可选的双向协变可以被外部的linter强制执行。
|
||||
|
||||
## 扩展与声明合并
|
||||
@ -86,24 +86,24 @@ declare let A: A_Static;
|
||||
|
||||
这里的利弊如下:
|
||||
|
||||
* 标准方式可以使用extends来继承;分解的类不能。这可能会在未来版本的TypeScript里改变:是否允许任何的extends表达式
|
||||
* 都允许之后为类添加静态成员
|
||||
* 允许为分解的类再添加实例成员,标准版不允许
|
||||
* 使用分解类的时候,为成员起合理的名字
|
||||
* 标准方式可以使用extends来继承;分解的类不能。也可能会在未来版本的TypeScript里做出改变:是否允许任意extends表达式
|
||||
* 都允许之后为类添加静态成员(通过合并声明的方式)
|
||||
* 分解的类允许增加实例成员,标准版不允许
|
||||
* 使用分解类的时候,需要为多类型成员起合理的名字
|
||||
|
||||
## 命名规则
|
||||
|
||||
一般来讲,不要给接口加I前缀(比如:IColor)。
|
||||
类为TypeScript里的接口类型比C#或Java里的意义更为广泛,IFoo命名不利于这个特点。
|
||||
因为TypeScript的接口类型概念比C#或Java里的意义更为广泛,IFoo命名不利于这个特点。
|
||||
|
||||
# 例子
|
||||
|
||||
下面进行例子部分。对于每个例子,先是使用*使用方法*,然后是类型声明。
|
||||
下面进行例子部分。对于每个例子,首先使用*应用示例*,然后是类型声明。
|
||||
如果有多个好的声明表示方法,会列出多个。
|
||||
|
||||
## 参数对象
|
||||
|
||||
#### 使用方法
|
||||
#### 应用示例
|
||||
|
||||
```ts
|
||||
animalFactory.create("dog");
|
||||
@ -113,7 +113,7 @@ animalFactory.create("panda", { name: "bob", height: 400 });
|
||||
animalFactory.create("cat", { height: 32 });
|
||||
```
|
||||
|
||||
#### 类型
|
||||
#### 类型声明
|
||||
|
||||
```ts
|
||||
namespace animalFactory {
|
||||
@ -128,14 +128,14 @@ namespace animalFactory {
|
||||
|
||||
## 带属性的函数
|
||||
|
||||
#### 使用方法
|
||||
#### 应用示例
|
||||
|
||||
```ts
|
||||
zooKeeper.workSchedule = "morning";
|
||||
zooKeeper(giraffeCage);
|
||||
```
|
||||
|
||||
#### 类型
|
||||
#### 类型声明
|
||||
|
||||
```ts
|
||||
// Note: Function must precede namespace
|
||||
@ -147,7 +147,7 @@ namespace zooKeeper {
|
||||
|
||||
## 可以用new调用也可以直接调用的方法
|
||||
|
||||
#### 使用方法
|
||||
#### 应用示例
|
||||
|
||||
```ts
|
||||
let w = widget(32, 16);
|
||||
@ -157,7 +157,7 @@ w.sprock();
|
||||
y.sprock();
|
||||
```
|
||||
|
||||
#### 类型
|
||||
#### 类型声明
|
||||
|
||||
```ts
|
||||
interface Widget {
|
||||
@ -172,9 +172,9 @@ interface WidgetFactory {
|
||||
declare let widget: WidgetFactory;
|
||||
```
|
||||
|
||||
## 全局的/不清楚的Libraries
|
||||
## 全局的或未知的外部Libraries
|
||||
|
||||
#### 使用方法
|
||||
#### 应用示例
|
||||
|
||||
```ts
|
||||
// Either
|
||||
@ -184,7 +184,7 @@ x.open();
|
||||
zoo.open();
|
||||
```
|
||||
|
||||
#### 类型
|
||||
#### 类型声明
|
||||
|
||||
```ts
|
||||
declare namespace zoo {
|
||||
@ -198,7 +198,7 @@ declare module "zoo" {
|
||||
|
||||
## 外部模块的单个复杂对象
|
||||
|
||||
#### 使用方法
|
||||
#### 应用示例
|
||||
|
||||
```ts
|
||||
// Super-chainable library for eagles
|
||||
@ -214,7 +214,7 @@ var eddie = new Eagle('Mille');
|
||||
eddie.kind = 'golden';
|
||||
```
|
||||
|
||||
#### 类型
|
||||
#### 类型声明
|
||||
|
||||
```ts
|
||||
interface Eagle {
|
||||
@ -232,13 +232,13 @@ export = Eagle;
|
||||
|
||||
## 回调函数
|
||||
|
||||
#### 使用方法
|
||||
#### 应用示例
|
||||
|
||||
```ts
|
||||
addLater(3, 4, x => console.log('x = ' + x));
|
||||
```
|
||||
|
||||
#### 类型
|
||||
#### 类型声明
|
||||
|
||||
```ts
|
||||
// Note: 'void' return type is preferred here
|
||||
|
Loading…
Reference in New Issue
Block a user