我不知道如何准确地把正确的术语放在这里,所以如果我用错了名称,请原谅我。我有下面这个函数(或者至少是这个例子中它的一个子集):
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的优点,而不必显式地转换类型吗?
1条答案
按热度按时间cwtwac6a1#
这是预期的行为,并且被编程为这样
基本上没有办法实现你的意图
这也适用于大多数类型的对象