Javascript 为什么TypeScript使用;例如;类型?
为什么TypeScript有一个类型,然后有一个“相似类型”?这方面的一个例子是Javascript 为什么TypeScript使用;例如;类型?,javascript,typescript,types,promise,Javascript,Typescript,Types,Promise,为什么TypeScript有一个类型,然后有一个“相似类型”?这方面的一个例子是Promise和PromiseLike 这两种类型之间有什么区别?我应该什么时候使用它们?在这种情况下,为什么不只使用一个Promise类型呢?如果您查看定义文件(让我们看一下),那么它就非常简单了 例如,界面: interface ArrayLike<T> { readonly length: number; readonly [n: number]: T; } 它会导致以下错误: “
Promise
和PromiseLike
这两种类型之间有什么区别?我应该什么时候使用它们?在这种情况下,为什么不只使用一个
Promise
类型呢?如果您查看定义文件(让我们看一下),那么它就非常简单了
例如,界面:
interface ArrayLike<T> {
readonly length: number;
readonly [n: number]: T;
}
它会导致以下错误:
“IArguments”类型的参数不能分配给类型的参数
“任何[]”。类型“IAruments”中缺少属性“push” 但如果我这样做,两者都会起作用:
function getSize(arr: ArrayLike<any>): number {
return arr.length;
}
我会这样做:
function doSomething(promise: PromiseLike<any>) { ... }
这使得它非常具体,其他实现可能具有不同的属性,例如不同的原型:
interface PromiseConstructor {
readonly prototype: Promise<any>;
...
}
接口承诺构造函数{
只读原型:Promise、、等)。
为了让typescript与使用这些实现的代码库一起工作,必须有一种类型而不是Promise
,否则会有很多矛盾。如果我问你数组和ArrayLike对象以及它们之间的区别,你会怎么回答?你看过了吗?谢谢你的链接。很高兴看到定义类型然而,这个问题更关注两种类型之间的语义差异,而不仅仅是它们的接口。定义这两种类型的目的是什么?作者为什么选择这样做?我认为@Thomas暗示这里有正交API设计的含义。它们是什么?答案涵盖了这一点这些更大的设计问题正是我所追求的。如果你愿意,我可以更新问题的措辞。原因是除了本机的实现(蓝鸟等),还有其他的Promise
实现,它们是PromiseLike
。与数组相同,例如参数是ArrayLike
,但不是数组
。如果返回PromiseLike
,如果定义是PromiseLike
,则应该有效。请将实际代码添加到问题中,您可能还有另一个问题。@NitzanTo谢谢你的评论。我已经更新了这个问题,使之更符合我本来应该问的问题。答案很好,但在这种特殊情况下,我仍然感到困惑。为什么要有catch()问题PromiseLike
?@rekire我不知道为什么他们选择只在PromiseLike
中包含,但我猜有些承诺实现没有捕获的功能(例如看起来没有)。非常感谢,它救了我的命。
function getSize(arr: ArrayLike<any>): number {
return arr.length;
}
function doSomething(promise: Promise<any>) { ... }
function doSomething(promise: PromiseLike<any>) { ... }
declare var Promise: PromiseConstructor;
interface PromiseConstructor {
readonly prototype: Promise<any>;
...
}