如何拒绝类型未知的TypeScript中不兼容的函数参数

如何拒绝类型未知的TypeScript中不兼容的函数参数,typescript,Typescript,下面的代码被TypeScript在严格模式下接受,尽管我不希望这样。函数的值参数合法地是未知或任何类型:在这个阶段,它可以是任何类型,因为它被代理 但是,由于未知匹配以及允许的参数数量减少,测试调用被接受 interface Mine { x: number } function handle( field: number, onChange: (field:Mine, value: unknown) => void, ) { } function testCall() {

下面的代码被TypeScript在严格模式下接受,尽管我不希望这样。函数的
参数合法地是
未知
任何
类型:在这个阶段,它可以是任何类型,因为它被代理

但是,由于未知匹配以及允许的参数数量减少,测试调用被接受

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无法解决此问题,因为它不是键入错误。也许可以改变你论点的顺序?