如何拒绝类型未知的TypeScript中不兼容的函数参数
下面的代码被TypeScript在严格模式下接受,尽管我不希望这样。函数的如何拒绝类型未知的TypeScript中不兼容的函数参数,typescript,Typescript,下面的代码被TypeScript在严格模式下接受,尽管我不希望这样。函数的值参数合法地是未知或任何类型:在这个阶段,它可以是任何类型,因为它被代理 但是,由于未知匹配以及允许的参数数量减少,测试调用被接受 interface Mine { x: number } function handle( field: number, onChange: (field:Mine, value: unknown) => void, ) { } function testCall() {
值
参数合法地是未知
或任何
类型:在这个阶段,它可以是任何类型,因为它被代理
但是,由于未知匹配以及允许的参数数量减少,测试调用被接受
interface Mine { x: number }
function handle(
field: number,
onChange: (field:Mine, value: unknown) => void,
) {
}
function testCall() {
handle(123, (value: unknown) => {})
}
有没有办法拒绝接受比预期更少参数的函数?或者有什么方法可以拒绝隐式转换为未知?可以用参数较少的函数代替参数较多的函数,同样,可以用接受类型较宽的参数的函数代替类型较窄的函数。() 具体地说,在这种情况下,
(value:unknown)=>void
可以接受两个参数,并且由于value
是unknown
,它应该能够处理Mine
类型的值
使用此选项的常见示例是.map
.map((v:unknown)=>`${v}`)
工作,即使map
也有一个索引参数和一个原始数组参数
如果不能意外地不包含类型这一点非常重要,则可以使用具有属性而不是参数的类,以及不接受参数的主方法:
abstract class OnChange {
private field: Mine;
private value: unknown;
public constructor (field: Mine, value: unknown) { this.field = field; this.value = value; }
public abstract main(): void;
}
不过,这似乎比它的价值要麻烦得多,所以我只使用带有可缩小参数的函数,正如我所希望的那样。谢谢您的文档参考。我想我遇到的麻烦是处理那些并不真正未知的“未知”类型,以及受到意外类型扩展的影响。理想情况下,我想要一个表示JSON可编码值的类型,但不是any
/unknown
。在这种情况下,我不确定这是如何应用的。如果传入的函数可以处理不可json编码的值,为什么会出现问题?此外,虽然可以键入JSON可编码值的子集,但没有针对所有JSON可编码值的类型。在我的特定示例中,问题在于testCall
忘记了它将接收并提供一个Mine
参数,而不是忽略它。它想要的值实际上是回调的第二个参数。但由于值类型未知,因此未检测到此错误。我现在理解您的问题,但我认为typescript无法解决此问题,因为它不是键入错误。也许可以改变你论点的顺序?