Javascript 为什么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; } 它会导致以下错误: “

为什么TypeScript有一个类型,然后有一个“相似类型”?这方面的一个例子是
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>;

    ...
}