Typescript 可以键入脚本';s Int8ArrayConstructor类型定义将被简化

Typescript 可以键入脚本';s Int8ArrayConstructor类型定义将被简化,typescript,Typescript,我正在检查typescript核心中的以下类型定义 这可以简化为: interface Int8ArrayConstructor { readonly prototype: Int8Array; new(length: number): Int8Array; new(array: ArrayLike<number> /*| ArrayBufferLike */): Int8Array; new(buffer: ArrayBufferLike, byte

我正在检查typescript核心中的以下类型定义

这可以简化为:

interface Int8ArrayConstructor {
    readonly prototype: Int8Array;
    new(length: number): Int8Array;
    new(array: ArrayLike<number> /*| ArrayBufferLike */): Int8Array;
    new(buffer: ArrayBufferLike, byteOffset?: number, length?: number): Int8Array;
接口Int8ArrayConstructor{
只读原型:Int8Array;
新(长度:数字):Int8Array;
新的(数组:ArrayLike/*| ArrayBufferLike*/):Int8Array;
新建(缓冲区:ArrayBufferLike,byteOffset?:number,length?:number):Int8Array;
也就是说,从第二行
new
可以删除
ArrayBufferLike
类型,对吗


此外,如果调用
new Int8Array(xyz)
时使用
ArrayBufferLike
作为参数,则会将其解析为上述哪一条声明行?

几乎,区别在于当您有一个类型为
ArrayLike | ArrayBufferLike
()

接口建议使用T8ArrayConstructor{
只读原型:Int8Array;
新(长度:数字):Int8Array;
新的(数组:ArrayLike/*| ArrayBufferLike*/):Int8Array;
新建(缓冲区:ArrayBufferLike,byteOffset?:number,length?:number):Int8Array;
}
declare const ProposedConstructor:ProposedInt8ArrayConstructor
声明const def_buffer:ArrayBufferLike;
declare const可以是:ArrayBufferLike | ArrayLike;
新的Int8Array(def_buffer);//解析为第二个重载,但第三个重载有效
新的Int8Array(可能是)//有效
新的ProposedConstructor(def_buffer)//解析为第三个重载
新建议的构造函数(可能是)//此处出错!
至于它们解析为哪种重载,您可以阅读上述代码块中行旁边的注释,或者通常将鼠标悬停在游乐场或其他启用intellisense的环境中的呼叫签名上:

因此,它解析为第二个重载,因为没有额外的可选参数,其中与您的提案一样:


它解决了第三个问题。

Hmm。这是一个很强的洞察力。干得好。至于问题的第二部分,哪个分支将“new Int8Array(ArrayBufferLike)”resolve?我的意思是,因为最后两个分支的返回类型都是相同的,所以在这种特定情况下这并不重要,但一般来说…
//解析为第二个重载,但第三个重载将是有效的
//解析为第三个重载
在代码块中:)现在添加了更多的信息。谢谢。这真是太疯狂了TS接受类似的内容。例如,并推断b为一个数字。您是否遇到返回类型不同的情况?通常是“解决第一个可行重载”工作得很好,但是如果你有一个合理的用例被这个阻止了,我很想看到它,因为我正在试图编译证据来改变它。我没有。只是在上面编了一个例子。但是我看到上面的逻辑有两个漏洞。一个是,在ArrayLike | ArrayBufferLike中不允许调用我建议的构造函数第二个是分解为第一个满意分支。
interface ProposedInt8ArrayConstructor {
    readonly prototype: Int8Array;
    new(length: number): Int8Array;
    new(array: ArrayLike<number> /*| ArrayBufferLike */): Int8Array;
    new(buffer: ArrayBufferLike, byteOffset?: number, length?: number): Int8Array;
}

declare const ProposedConstructor: ProposedInt8ArrayConstructor

declare const def_buffer: ArrayBufferLike;

declare const may_be_either: ArrayBufferLike | ArrayLike<number>;

new Int8Array(def_buffer); // resolves to the second overload but 3rd would be valid
new Int8Array(may_be_either) // valid

new ProposedConstructor(def_buffer) // resolves to 3rd overload
new ProposedConstructor(may_be_either) // ERROR HERE!