TypeScript 解构了带有类型或接口的默认参数
TypeScript destructured default parameter with type or interface
我正在编写一个函数,它接受一个可选对象 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
可能未定义(当参数设置为 optional 时由它解释),所以params
上面可能不存在。
但是,它没有考虑到 可选 参数可能有默认值。然而,我还没有找到在类型或接口中正确指示这一点的方法。直接在函数签名中键入确实有效,但这不能重复使用或导出。
在使用类型或接口时是否有任何标准方法可以解决这个问题?
通过 myFoo: Foo
的参数列表 中 options
参数 的类型推断是 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 = {}) => {};
我正在编写一个函数,它接受一个可选对象 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
可能未定义(当参数设置为 optional 时由它解释),所以params
上面可能不存在。
但是,它没有考虑到 可选 参数可能有默认值。然而,我还没有找到在类型或接口中正确指示这一点的方法。直接在函数签名中键入确实有效,但这不能重复使用或导出。
在使用类型或接口时是否有任何标准方法可以解决这个问题?
通过 myFoo: Foo
的参数列表 中 options
参数 的类型推断是 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 = {}) => {};