Home > Software engineering >  Specifying type of argument dictionary keys in function definition itself
Specifying type of argument dictionary keys in function definition itself

Time:03-06

In TypeScript, I can do this:

interface Prop {
    prop_a? : number,
    prop_b? : string,
    prop_c? : string
}

function aa({prop_a, prop_b, prop_c}: Prop) {
    console.log('aa: '   prop_a   ' '   prop_b   ' '   prop_c)
}

But then, why this is not allowed:

//A binding pattern parameter cannot be optional in an implementation signature.(2463)
function aaa({prop_a?: number, prop_b?: string, prop_c?: string}) {
    console.log('aa: '   prop_a   ' '   prop_b   ' '   prop_c)
}

Also, specifying types of dictionary keys even if they are non-optional (that is removinb ? from above snippet) is not allowed:

function aaaa({prop_a: number, prop_b: string, prop_c: string}) {
    console.log('aa: '   prop_a   ' '   prop_b   ' '   prop_c)
}

Is it just language design choice or its indeed allowed, but am missing something?

CodePudding user response:

why this is not allowed

Because that's just not how the syntax is defined. You can do it inline, you just replace Prop with the definition of Prop:

function aa({prop_a, prop_b, prop_c}: {prop_a?: number; prop_b?: string; prop_c?: string;}) {
    // −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    console.log('aa: '   prop_a   ' '   prop_b   ' '   prop_c)
}

Is it just language design choice...

The types can't go where you showed them because in that location, they look like renamed destructured parameters (prop_a renamed to number, etc.; though you wouldn't be allowed to use string twice as a destructuring target name):

function aaaa({prop_a: number, prop_b: string, prop_c: string2}) {
    console.log("number = "   number);
}
aaaa({prop_a: 42});

Also, it's more consistent for them to go in the same place as your original Prop.

CodePudding user response:

That's incorrect syntax, the proper way to do it is this:

function aaa({ prop_a, prop_b, prop_c }: { prop_a?: number, prop_b?: string, prop_c?: string }) {

This is incorrect because the type annotations are inside the destructuring assignment.

function aaa({prop_a?: number, prop_b?: string, prop_c?: string}) {

It is similar to:

const [foo: number, bar: string] = baz; // ! error

const [foo, bar]: [number, string] = baz; // good
  • Related