Typescript 为什么即使提供了有效的默认值,我也无法对可选参数进行分解?

Typescript 为什么即使提供了有效的默认值,我也无法对可选参数进行分解?,typescript,Typescript,这只是我的代码中缺少功能还是有缺陷 目标是让用户能够在不提供选项的情况下调用my函数,并且仍然可以在签名中分解选项 // Typings export interface MyFunctionOptions { optParam?: boolean; } export type MyFunction = (mandatoryParam: string, opts?: MyFunctionOptions) => void; // F

这只是我的代码中缺少功能还是有缺陷

目标是让用户能够在不提供选项的情况下调用my函数,并且仍然可以在签名中分解选项

// Typings
export interface MyFunctionOptions {
  optParam?: boolean;
}
export type MyFunction = (mandatoryParam: string, 
                          opts?: MyFunctionOptions) => void;

// Functions
const myFunction: MyFunction = (mandatoryParam, { 
                                  optParam,
                                } = { optParam: false }) => {
  // use `optParam` directly, instead of `opts.optParam`
  return;
}

(请确保在REPL中启用
stricnullchecks
为解构参数指定默认值的语法是
{param=default}

function foo({param = true}) {
    console.log(param) // param is boolean
}

foo({}) // the parameter is required
foo({ param: true}) 
为了使参数本身成为可选的,我们可以为整个参数指定默认值
{}

function foo({param = true} = {}) {
    console.log(param) // param is boolean
}

foo() // the parameter is optional
如果我们将此逻辑应用于您的样品,我们将得到:

const myFunction = (mandatoryParam: string, { optParam = false } = {}) => {
    optParam
    return;
}
myFunction("") // not required
myFunction("", {}) // optParam is optional
myFunction("", { optParam: true }) // optParam can be set 
当我们尝试显式指定函数的类型时,问题出现了,然后第二个参数被推断为
MyFunctionOptions | undefined
,它以任何方式都不可索引。这个不幸的推断的简单解决方案是显式指定非结构化参数的类型:

const myFunction: MyFunction = (mandatoryParam: string, { optParam = false } : MyFunctionOptions = {}) => {
    optParam
    return;
}
myFunction("")
myFunction("", {})
myFunction("", { optParam: true })

您的游乐场链接似乎使用了另一种似乎有效的语法:
const myFunction:myFunction=(mandatoryParam,{optParam=false}={})=>{console.log(optParam);return;}
为什么会有差异?@TitianCernicova Dragomir@TitianCernicova Dragomir我相信第一个语法只是第一个表达式的糖,我只是试着使用ES6语法看看它是否能修复。另外,请在选项中启用
strictNullChecks
以查看失败,我将更新答案以使其更清楚。REPL link updated现在。我假设你也有
strictFunctionTypes
enable?我有一个解决方案,但它只适用于
strictFunctionTypes:false
@TitianCernicova Dragomir我有,但我很好奇,你能分享这个游乐场吗?这基本上是你的解决方案,但有完整类型的解构参数。“第二个参数被推断为
MyFunctionOptions | undefined
,它以任何方式都不可索引“什么意思是不可索引?@doplumi对于联合,我们只能访问公共属性,
MyFunctionOptions
undefined
显然没有公共属性,因此无法访问任何属性,并且分解结构将被视为属性访问