我必须验证typescript重载中的每个参数吗?

我必须验证typescript重载中的每个参数吗?,typescript,Typescript,我有两个超负荷的update。我可以通过检查第一个参数来确定我处于哪个过载状态: CRC16级{ 更新(缓冲区:编号[],偏移量:编号,长度:编号):编号; 更新(数据:编号):编号; 更新(缓冲区:编号[]|编号,偏移量?:编号,长度?:编号){ if(Array.isArray(buffer)//检查第一个参数 &&偏移量!==未定义&&length!==未定义)//这些检查是多余的 返回长度-偏移量; 其他的 返回1; } } 常数c=新的CRC16(); console.log( c、

我有两个超负荷的
update
。我可以通过检查第一个参数来确定我处于哪个过载状态:

CRC16级{
更新(缓冲区:编号[],偏移量:编号,长度:编号):编号;
更新(数据:编号):编号;
更新(缓冲区:编号[]|编号,偏移量?:编号,长度?:编号){
if(Array.isArray(buffer)//检查第一个参数
&&偏移量!==未定义&&length!==未定义)//这些检查是多余的
返回长度-偏移量;
其他的
返回1;
}
}
常数c=新的CRC16();
console.log(
c、 更新(1),
c、 更新([1,2,3,4],1,4));

Typescript给出
错误TS2532:如果我注释掉剩余参数上的冗余检查,则对象可能是
长度
偏移量
的“未定义”错误。(冗余检查可以防止像
c.update([1,2,3,4])
这样的调用,但typescript无论如何都禁止这样做,因为它没有任何重载。)有没有一种方法可以编写这样的代码,这样我就不必认真地检查每个参数了吗?

我认为所有这3个重载都非常相似,没有多大帮助。另外,为什么要将函数参数从
buffer
重命名为
data
?如果不同,那么应该有两个函数

这个界面还不够吗

update(buffer: number[] | number, offset?: number, length?: number): number
这一个捕获上面的所有重载。那么,关于跳过代码中的检查,我不理解这一点。TypeScript为您的代码提供类型,但它不会阻止您检查函数输入,就像您使用普通js一样


我认为您试图将太多的“责任”放在TS端。

原型足以告诉typescript拒绝使用
buffer:number[]
但没有
offset
length
的调用。我的问题是,为什么像
Array.isArray(buffer)
这样的测试会在嵌套代码中强烈地将
buffer
类型设置为
number[]
,但不需要输入
offset
length
。Typescript特别要求我测试它们,即使兼容的原型声明了它们的非可选性。此外,将
数据
更改为
缓冲区
以匹配早期原型不会改变行为。我认为,在人们将用作文档的真实原型中,与其强制所有原型使用相同的名称(即,将单个数字称为“缓冲区”会产生误导),不如使用信息丰富的参数名称。