Typescript 可以键入脚本';s Int8ArrayConstructor类型定义将被简化
我正在检查typescript核心中的以下类型定义 这可以简化为: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
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!