gpt4 book ai didi

typescript - 如何正确输入重载函数

转载 作者:行者123 更新时间:2023-12-04 15:06:11 24 4
gpt4 key购买 nike

我有以下 JavaScript 函数:

function combinedHash(first, second) {
if (!first) {
return second;
}
if (!second) {
return first;
}

return keccak256(sortAndConcat(first, second));
}

firstsecond 可以是 null。我正在尝试编写一个具有比以下更好的类型推断的类型化函数:

function combinedHash(first: Buffer | null, second: Buffer | null): Buffer | null {
if (!first) {
return second;
}
if (!second) {
return first;
}

return keccak256(sortAndConcat(first, second));
}

当且仅当 firstsecond 都是空。

到目前为止我的尝试是:

function combinedHash(first: null, second: null): null;
function combinedHash(first: null, second: Buffer): Buffer;
function combinedHash(first: Buffer, second: null): Buffer;
function combinedHash(first: Buffer, second: Buffer): Buffer {
if (!first) {
return second;
}
if (!second) {
return first;
}

return keccak256(MerkleTree.sortAndConcat(first, second));
}

但是我得到以下错误:

> 2394: This overload signature is not compatible with its implementation signature.

有没有可能实现我想要的?

最佳答案

Overloaded functions在 Typescript 中是通过将函数的类型签名分成两部分来实现的:函数调用者看到的一个或多个调用签名,以及在此之后的单个实现签名 被函数的实现者看到。您遗漏了实现签名(或者更确切地说,您不小心使用了最后一个调用签名作为实现签名)。


调用签名只是声明,并未实现。因此,您仅使用分号 ; 而不是实现 block { ... } 结束调用签名。在您的情况下,您希望 combinedHash 以四种可能的方式之一被调用,对应于 firstsecond 中的每一个都是 缓冲区null:

// the call signatures, seen by the callers:
static combinedHash(first: null, second: null): null;
static combinedHash(first: null, second: Buffer): Buffer;
static combinedHash(first: Buffer, second: null): Buffer;
static combinedHash(first: Buffer, second: Buffer): Buffer;

实现签名既被声明又被实现,就像一个普通的函数。此签名必须与每个调用签名“兼容”:您必须能够将每个调用签名的参数列表分配给实现的参数列表(这是类型安全的);并且您必须能够将每个调用签名的返回类型分配给实现的返回类型(这实际上是不安全的,但允许)。那么在您的情况下,您需要 firstsecond 至少与 Buffer | 一样宽null,并且您需要返回类型类似于 Buffer | null 以及:

// and then the implementation signature, seen by the implementation:
static combinedHash(first: Buffer | null, second: Buffer | null) {
if (!first) {
return second;
}
if (!second) {
return first;
}

return keccak256(MerkleTree.sortAndConcat(first, second));
}

这现在应该可以正常工作了。


请注意,您现在不能调用 combinedHalf(),其中任何一个参数都是 Buffer |空。每个参数必须是 Buffernull。如果您觉得这限制太多,您可能希望将您的调用签名更改为如下所示:

static combinedHash(first: null, second: null): null;
static combinedHash(first: Buffer | null, second: Buffer): Buffer;
static combinedHash(first: Buffer, second: Buffer | null): Buffer;
static combinedHash(first: Buffer | null, second: Buffer | null): Buffer | null;

这允许 Buffer | null 为每个参数传入。如果任一参数已知为 Buffer,则输出为 Buffer。如果两个参数都已知为 null,则输出为 null。并且如果已知两个参数都小于 Buffer | null,则输出为Buffer |空:

function doStuff(buffer: Buffer, maybeBuffer: Buffer | null) {
Foo.combinedHash(buffer, buffer).length; // okay
Foo.combinedHash(buffer, maybeBuffer).length; // okay
Foo.combinedHash(maybeBuffer, buffer).length; // okay
Foo.combinedHash(maybeBuffer, null).length // error, possibly null
Foo.combinedHash(null, null) // definitely null
}

Playground link to code

关于typescript - 如何正确输入重载函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66071930/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com