匿名接口
我想指出,您也可以在参数列表中不使用名称声明类型,如下所示,这样可以避免我们键入interface myfuncArgs
。
这仍然强制我重新输入每个参数,这是一件麻烦的事情,但我目前不知道如何避免它。
const assert = require('assert')
function myfunc({
myInt,
myString,
}: {
myInt: number,
myString?: string,
}
) {
return `${myInt} ${myString}`
}
assert.strictEqual(
myfunc({
myInt: 1,
myString: 'abc',
}),
'1 abc'
)
assert.strictEqual(
myfunc({
myInt: 1,
}),
'1 undefined'
)
编译并运行:
npx tsc main.ts
node main.js
测试环境:
"dependencies": {
"@types/node": "^16.11.13",
"typescript": "^4.5.4"
}
相关文章:
当存在可选参数时,通常需要显式地定义接口
如果任何一个prop是可选的,就像下面的例子一样,以及大多数“选项”params的情况下,您可能希望明确定义类型,如https://dev59.com/31gQ5IYBdhLWcg3w3Hp-#42108988中所述,因为调用者很可能迟早都需要它来逐步构建选项对象,相关:如何在TypeScript中动态分配属性到对象?
例如,考虑以下有效代码:
const assert = require('assert')
interface myfuncOpts {
myInt: number,
myString?: string,
}
function myfunc({
myInt,
myString,
}: myfuncOpts) {
return `${myInt} ${myString}`
}
const opts: myfuncOpts = { myInt: 1 }
if (process.argv.length > 2) {
opts.myString = 'abc'
}
assert.strictEqual(
myfunc(opts),
'1 abc'
)
如果我们在内联中定义了
myfuncOpts
,那么我们就无法进行
const opts: myfuncOpts
,然后执行
opts.myString = 'abc'
会失败,因为在:
const opts = { myInt: 1 }
if (process.argv.length > 2) {
opts.myString = 'abc'
}
opts
的类型是从初始化中推导出来的,其中不包含 myString
。
我希望 TypeScript 能够实现一种系统,让我们可以说“使用这个函数的某个参数的类型”。然后我们就可以使用内联的参数类型定义,但仍然可以引用类型,在那种情况下,它将是极乐世界。