Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
传递到函数中的对象的Typescript默认参数_Typescript - Fatal编程技术网

传递到函数中的对象的Typescript默认参数

传递到函数中的对象的Typescript默认参数,typescript,Typescript,我希望以与标量值类似的方式初始化传递到函数中的对象,例如: someFunction(myValue: number = 5) { } 所以,我保留类型和默认值。我想对以下内容应用类似的构造: someFunction(myObj: {val1: number, val2: number}) { } 如果我一直往前走,只需执行更简单的复制粘贴解决方案: someFunction(myObj: {val1: number = 5, val2: number = 10}) {} 每个初始

我希望以与标量值类似的方式初始化传递到函数中的对象,例如:

someFunction(myValue: number = 5) {  }
所以,我保留类型和默认值。我想对以下内容应用类似的构造:

someFunction(myObj: {val1: number, val2: number}) { }
如果我一直往前走,只需执行更简单的复制粘贴解决方案:

someFunction(myObj: {val1: number = 5, val2: number = 10}) {}  
每个初始化方法都提供一个类型脚本erorr
类型文本属性不能有初始值设定项。
。好的,明白了,我无法将类型文本与初始化混合。通过类比,我们得出:

someFunction(myValue: number = 5) {  }
             ^^^^^^^  ^^^^^^   ^^
              |         |       +-- Initialization value
              |         +-- Type literal
              +-- Parameter name
类似地:

someFunction(myObj: {val1: number, val2: number} = {val1: 5, val2: 10}) {}
             ^^^^^   ^^^^^^^^^^^^^^^^^^^^^^^^^^     ^^^^^^^^^^^^^^^^^^
              |         |                              +-- Initialization
              |         +-- Type literal
              +-- Parameter name
解决方案是使用更详细的语法:

someFunction(myObj: {val1: number, val2: number} = {val1: 5, val2: 10}) {}
问题是,有可能吃一块蛋糕:有像标量值默认值定义中那样的简洁语法(number=5)和带有对象定义的完整类型控件吗


PS I请求ASCII艺术奖励积分:)

您可以使用界面:

interface myObj {
  name: string;
  age: number;
  anyValue?: any;
}

const someFunction = (myObj: myObj) => {
  // method body
};
我希望我能正确理解您的问题并帮助您:) 和mb。这:,,
所以使用界面是一个很好的解决方案。

没有内置的方法来实现这一点。最简单的解决方案是让编译器根据默认值推断参数类型:

function someFunction(myObj = { val1: 5, val2: 10 }) { }
此解决方案的问题是参数上的所有属性都是必需的,因此即使它们的值未定义,也必须指定它们

为了解决这个问题,我们可以定义一个helper函数,该函数返回一个类型,其中所有项都标记为可选:

function params<T>(o: T): Partial<T> {
    return o;
}
function someFunction2(myObj = params({ val1: 5, val2: 10, otherValueWithoutDefault: null as number })) { } 
函数参数(o:T):部分{
返回o;
}
函数someFunction2(myObj=params({val1:5,val2:10,otherValueWithoutDefault:null as number})){
或同时支持可选和必需参数的版本:

function params<TRequired>() : <TOptional>(o: TOptional) => Partial<TOptional> & TRequired
function params<TOptional>(o: TOptional) : Partial<TOptional> 
function params<T>(o?: T): Partial<T> | (<TOptional>(o: TOptional) => Partial<TOptional> & T) {
    if(o != null) {
        return o;
    } else {
        return function(o : any) { return o; } as any
    }
}
function someFunction2(myObj = params<{ required: boolean}>()({ val1: 5, val2: 10})) { }

someFunction2({
    required: true,
    val1: 0
})
function params():(o:TOptional)=>Partial&t必需
函数参数(o:Topional):部分
函数参数(o?:T):部分((o:topical)=>Partial&T){
如果(o!=null){
返回o;
}否则{
返回函数(o:any){returno;}如any
}
}
函数someFunction2(myObj=params()({val1:5,val2:10})){}
某些功能2({
要求:正确,
val1:0
})

如果您利用了Destructuring,您可以减少大量重复的代码,但是了解这些差异很重要。这是我通常使用的模式

函数fun({val1=1,val2=2}={}){
返回val1+val2
}
此函数的签名被正确推断为
函数fun({val1,val2}?:{val1?:number;val2?:number;}):number

但是,需要注意的是,此函数在几个重要方面与原始函数不同

  • fun({val1:2})
    将导致
    val2
    仍然是默认值,
    2

  • 如果您需要一个必需的参数(如果您提供任何东西,您必须提供它),您必须返回到指定所有内容,这很快会变得更加混乱,因为您在两个位置有初始值设定项。这可以通过使用接口来描述类型来缓解

    接口参数{
    val1?:数字
    val2?:数字
    val3:字符串
    }
    函数fun({val1=1,val2=2,val3}:Args={val3:'}){
    返回val3。重复(val1+val2)
    }
    

  • 我投票结束这个问题,因为问题是我如何才能做到这一点,而编译器明确表示这是不可能做到的。Op已经知道了这一点,这也远远超出了语言的规范,更像是请求语言的新特性,而这不属于这里。也许你是对的,但我只是希望有人能够巧妙地处理这一风格障碍,而不必使用千行默认对象初始化语法膨胀函数定义。嘿,恐怕这不是我真正的意思。若使用接口,可以跳过类型文字,但我的主要目标是使初始化部分更加简洁。在您的示例中,您仍然被迫执行
    constsomefunction=(myObj:myObj={name:'Default',age:10})
    interface SquareConfig{color?:string;width?:number;}函数createSquare(config:SquareConfig):{color:string;area:number}{//}让mySquare=createSquare({color:“red”,width:100});我可以请你在评论中用代码更新你的答案吗?那么,其他人更容易跟踪响应