传递到函数中的对象的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});我可以请你在评论中用代码更新你的答案吗?那么,其他人更容易跟踪响应