未在TypeScript上推断函数的返回类型

cuxqih21  于 2022-12-19  发布在  TypeScript
关注(0)|答案(1)|浏览(130)

我不知道如何准确地把正确的术语放在这里,所以如果我用错了名称,请原谅我。我有下面这个函数(或者至少是这个例子中它的一个子集):

interface Definition {
  props?: { type: string } | ((originalValue: string) => ({ type: string }))
}

function example(definition: Definition) {
  return definition // for the sake of the example let's keep it simple
}

在使用这个函数时,如果我尝试将props参数作为一个普通对象类型提供,那么类型推断工作得很好,如果我在那里放入一些不相关的内容,那么我会得到一个TS错误,正如我所预料的那样,但是,如果我提供回调函数,它就不会像我所预料的那样工作。
如果我提供一个对象:

example({
  props: { type: '', whateverIsNotThereAndShouldError: 1 } // this makes TS complain, as intended
})

但是,如果我尝试对回调执行相同的操作:

example({
  props: type => ({ type, whateverIsNotThereAndShouldError: 1 }), // no error
})

在上面的用法中,TS明显地识别了类型(当鼠标指针放在props上时,类型看起来是正确的),但对象上的伪元素没有被指向,代码完成也没有被触发。我最初认为这是VSCode的事情,但后来它在TS Playground上可以重现。
这里是Playground
这是一个有意的行为吗?我可以做些什么来保持第二种情况下TS的优点,而不必显式地转换类型吗?

cwtwac6a

cwtwac6a1#

这是预期的行为,并且被编程为这样
基本上没有办法实现你的意图
这也适用于大多数类型的对象

相关问题