我正在编写一个带有可选对象options
的函数,该对象本身包含可选属性params
。该options
对象的默认值为{}
,因此可以在函数签名中对其进行适当的解构。
但是,尝试通过界面键入它时遇到了问题:
type Params = {
params?: { [key: string]: boolean }
}
interface Foo {
(options?: Params): void
};
const myFoo: Foo = ({ params } = {}) => {} // Property 'params' does not exist on type 'Params | undefined'.
该错误是有道理的:就编译器所知,options
可能是未定义的(如将参数设置为可选时所解释的,因此params
可能不存在。
但是,没有考虑optional参数可能具有默认值。但是,我还没有找到一种在类型或接口中正确指出这一点的方法。直接在函数签名中输入确实可以,但是不能重复使用或导出。
使用类型或接口时,是否有任何标准方法可以解决此问题?
options
通过[myFoo: Foo
参数在参数列表中]的类型推断>为Params | undefined
,而不管实现中是否提供默认值。由于默认值,它仅在myFoo
的主体中将options
推断为Params
:// hover over options here: Params | undefined
const myFoo: Foo = (options = {}) => {
// hover over options here: Params
options;
};
要修复它,请推迟对象的结构分解,直到从实现的默认值完全推断出options
的类型为止:
// no error
const myFoo: Foo = (options = {}) => {
const { params } = options;
};
或者您已经发现,可以通过将参数显式键入为Params
来帮助类型推断。但是,在某些情况下,这可能会误导编译器:
// no error
const myFoo: Foo = ({ params }: Params = {}) => {};