为什么打字稿有一个类型,然后是“类型”?这方面的一个例子是Promise<T>
和PromiseLike<T>
。这两种类型有什么区别?我应该什么时候使用它们?在这种情况下,为什么不只有一个Promise
类型?为什么打字稿使用“Like”类型?
回答
如果你看看定义文件(让我们拿lib.es6.d.ts),那么它非常简单。
例如,ArrayLike接口:
interface ArrayLike<T> {
readonly length: number;
readonly [n: number]: T;
}
不止有限Array一个:
interface Array<T> {
length: number;
toString(): string;
toLocaleString(): string;
push(...items: T[]): number;
pop(): T | undefined;
concat(...items: T[][]): T[];
concat(...items: (T | T[])[]): T[];
join(separator?: string): string;
reverse(): T[];
shift(): T | undefined;
slice(start?: number, end?: number): T[];
sort(compareFn?: (a: T, b: T) => number): this;
splice(start: number, deleteCount?: number): T[];
splice(start: number, deleteCount: number, ...items: T[]): T[];
unshift(...items: T[]): number;
indexOf(searchElement: T, fromIndex?: number): number;
lastIndexOf(searchElement: T, fromIndex?: number): number;
// lots of other methods such as every, forEach, map, etc
[n: number]: T;
}
这是件好事,两地分居的,因为我可能希望有这样的功能:
function getSize(arr: Array<any>): number {
return arr.length;
}
console.log(getSize([1, 2, 3])); // works
但它不会与这个:
function fn() {
console.log(getSize(arguments)); // error
}
它的结果与此错误:
Argument of type 'IArguments' is not assignable to parameter of type 'any[]'.
Property 'push' is missing in type 'IArguments'.
但如果我这样做既会工作:
function getSize(arr: ArrayLike<any>): number {
return arr.length;
}
(更多ArrayLike in MDN)
同样有Promise
和PromiseLike
,如果我正在建立一个不关心工具的图书馆的Promise
的entation则不用这样做:
function doSomething(promise: Promise<any>) { ... }
我会做到这一点:
function doSomething(promise: PromiseLike<any>) { ... }
那么即使我的媒体库的用户使用的是不同的实现(蓝鸟)都可以正常运行精细。
如果你会注意到的Promise的定义是这样的:
declare var Promise: PromiseConstructor;
这使得它非常具体的,其他实现可能有不同的属性,例如不同的原型:
interface PromiseConstructor {
readonly prototype: Promise<any>;
...
}
我猜测我们有PromiseLike
的主要原因是有几个实现在原生支持之前可用(如bluebird,Promises/A+,jQuery,等等)。
为了使打字稿与使用这些实现的代码库一起工作,必须有除Promise
以外的其他类型,否则会有很多矛盾。
很好的答案,但在这种特殊情况下,我仍然感到困惑。为什么在'PromiseLike'中有'catch()'有问题? – rekire
@rekire我不知道他们为什么选择在'PromiseLike'中只包含'then',但我的猜测是某些promise实现没有'catch'(例如它看起来像[Promises/A +](https: //promisesaplus.com/)不)。 –
- 1. 什么是类型的打字稿
- 2. 为什么打字稿
- 3. 什么类型代表打字稿中的一种类型?
- 4. 为什么Visual Studio不能识别打字稿类型定义?
- 5. 下使用mysql类型的打字稿
- 6. 使用打字稿的功能类型
- 7. 为什么我需要打字才能使用打字稿?
- 8. 什么是装饰打字稿,为什么使用?需要使用打字稿的实时示例
- 9. 打字稿@类型/在packages.json
- 10. 泛型打字稿是什么使他们有用
- 11. 什么是打字稿
- 12. 什么是打字稿?
- 13. 打字稿中html元素的数组类型是什么?
- 14. 让打字稿知道对象是什么类型
- 15. 使用const作为打字稿中的对象和类型?
- 16. 如何为使用打字稿编写的库生成类型?
- 17. keyof为打字稿类
- 18. 打字稿类成为空
- 19. 打字稿分配泛型类型
- 20. 打字稿类型后卫继承类
- 21. 为什么使用angularjs1.5打字稿时需要_all.ts?
- 22. 打字稿中的字符串类型
- 23. 使用字符串文字类型的打字稿
- 24. 为什么打字稿编译犯规允许返回类
- 25. 为什么不能吸得超类的属性[打字稿]
- 26. 为什么打字稿中的这两个函数类型不同?
- 27. 的方法打字稿使用泛型类型
- 28. 使用类型安全定义打字稿泛型
- 29. Coverting打字稿字符串文字类型为字符串
- 30. 为打字稿
如果我问你有关阵列和ArrayLike对象以及它们有何不同,你会怎么回答? – Thomas
你看过[lib中的定义](https://github.com/Microsoft/TypeScript/blob/master/lib/lib.es6.d.ts#L1323)吗? –
感谢您的链接。很高兴看到定义的类型,但是这个问题更侧重于两种类型之间的语义差异,而不仅仅是它们的接口。这两种类型定义的目的是什么?为什么作者选择这样做?我认为@Thomas暗示这里有正交的API设计内涵。他们是什么?覆盖这些更大设计问题的答案就是我所追求的。如果你喜欢,我可以更新问题的措辞。 – Stewart