TypeScript函数参数解构默认值类型推断失效问题求解
TypeScript解构参数默认值的类型推断问题
当你显式指定函数参数的类型为某个接口时,TypeScript会优先遵循接口的类型定义,忽略解构参数默认值的类型推断——这就是你例子中foo类型为{}而非{ bar: number }的原因。
下面是几种可行的解决方法:
方法一:调整接口类型兼容默认值
如果接口定义允许修改,直接将foo的类型改为和默认值匹配的结构,TypeScript就能正确推断类型:
interface Args { foo: { bar: number }; } function test({ foo = { bar: 1 } }: Args) { // typeof foo 现在是 { bar: number } }
要是需要保留接口灵活性(比如foo可以是任意对象,但默认值有特定结构),可以将foo设为联合类型:
interface Args { foo: {} | { bar: number }; } function test({ foo = { bar: 1 } }: Args) { // typeof foo 为 {} | { bar: number },可通过类型收窄处理具体逻辑 }
方法二:用交叉类型覆盖接口指定参数类型
如果不想修改原接口,可通过Omit移除接口中foo的定义,再与默认值的类型做交叉,既复用接口的其他参数类型,又让foo的类型由默认值推断:
interface Args { foo: {}; other: string; // 假设接口包含其他必填参数 } // 提取默认值,复用其类型 const defaultFoo = { bar: 1 }; type CustomFooType = typeof defaultFoo; // 组合类型:移除接口的foo定义,替换为默认值的可选类型 function test({ foo = defaultFoo, other }: Omit<Args, 'foo'> & { foo?: CustomFooType } = { other: 'default' }) { console.log(foo.bar); // 类型检查通过,foo类型为 CustomFooType }
方法三:让TypeScript自动推断参数类型
如果接口仅用于约束当前函数参数,可直接省略显式接口指定,让TS从默认值和参数结构推断类型:
function test({ foo = { bar: 1 } }: { foo?: { bar: number } } = {}) { // typeof foo 为 { bar: number } }
若需要复用该参数类型,可将推断出的类型提取为类型别名:
type Args = { foo?: { bar: number } }; function test({ foo = { bar: 1 } }: Args = {}) { // typeof foo 为 { bar: number } }
内容的提问来源于stack exchange,提问作者ollog10
相关产品推荐
相关产品推荐

