在函数定义本身中指定参数字典键的类型
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
在 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