在函数定义本身中指定参数字典键的类型

Specifying type of argument dictionary keys in function definition itself

在 TypeScript 中,我可以这样做:

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)
}

但是,为什么不允许这样做:

//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)
}

此外,不允许指定字典键的类型,即使它们是非可选的(即从上面的代码片段中删除 ?):

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

这只是语言设计选择还是确实允许,但我遗漏了什么?

why this is not allowed

因为语法不是这样定义的。您可以内联,只需将 Prop 替换为 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...

类型不能去你展示它们的地方,因为在那个位置,它们看起来像是重命名的解构参数(prop_a 重命名为 number,等等;虽然你不会被允许使用 string 两次作为解构目标名称):

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

此外,它们与您原来的位置相同 Prop

这是错误的语法,正确的做法是:

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

这是不正确的,因为类型注释在解构赋值中。

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

类似于:

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

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