当前位置: 首页 > 知识库问答 >
问题:

在JavaScript中使用命名参数(基于TypeScript)

华宏逸
2023-03-14

我在TypeScript中使用命名参数时遇到问题。我知道它不支持我在TypeScript中使用它的方式。

但是我该怎么做呢?

打字稿:

SomeFunction(name1: boolean, name2: boolean, name3: boolean, name4: boolean) // Will occur only one time, so the change should be in TypeScript

JavaScript:

$(function () {
     ...SomeFunction({name1:false, name2:false, name3:false, name4:true}); // Will occur 100 times
});

我在看(这没有成功):

有没有办法在JavaScript中的函数调用中提供命名参数?

如何将可选的命名参数添加到 TypeScript 函数参数?

我可以在 TypeScript 中做什么,以便在 JavaScript 中使用命名参数?

我想知道的是,当我在TypeScript中使用命名参数时,VisualStudio2015没有显示语法错误。。。

PS.:我使用打字稿2.1

共有3个答案

公孙成仁
2023-03-14

匿名接口

我只是想指出,您也可以在参数列表中声明没有名称的类型,如下所示,这使我们免于键入接口 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'
)

// Fails as desired since myInt is not optional and was not given.
//assert.strictEqual(
//  myfunc({
//    myString: 'abc',
//  }),
//  'unefined abc'
//)

// Fails as desired since wrong type of myInt.
//assert.strictEqual(
//  myfunc({
//    myInt: '1',
//    myString: 'abc',
//  }),
//  '1 abc'
//)

编译并运行:

npx tsc main.ts
node main.js

测试于:

  "dependencies": {
    "@types/node": "^16.11.13",
    "typescript": "^4.5.4"
  }

相关:

> 在Typescript中析构函数参数

https://github.com/Microsoft/TypeScript/issues/29526功能请求允许语法:

function myfunc({
  myInt: Number,
  myString?: String,
})

当有可选参数时,您通常需要一个显式的接口

如果任何 props 是可选的,是以下示例的情况,并且可能是大多数“选项”参数的情况,那么您可能希望显式定义类型,如以下所述: https://stackoverflow.com/a/42108988/895245 因为调用者迟早需要它来逐步构建选项对象,相关: 如何在 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'
)

如果我们已经定义了<code>myfuncOpts</code>内联,那么我们将无法执行<code>const opts:myfuncOps</ccode>,然后执行<code>opts。myString='abc'将失败,因为:

const opts = { myInt: 1 }
if (process.argv.length > 2) {
  opts.myString = 'abc'
}

opts 的类型是从不包含 myString 的初始化中推断出来的。

我希望 TypeScript 能够实现一个系统,您可以在其中说“使用此类函数的此类参数的类型”。然后我们可以使用内联参数类型定义,但仍然以某种方式引用类型,它将是 Nirvana。

归翔
2023-03-14

获得接近“命名参数”的唯一方法是使用单个对象参数:

type SomeFunctionParams = {
    name1: boolean;
    name2: boolean;
    name3: boolean;
    name4: boolean;
}

SomeFunction(params: SomeFunctionParams) { ... }

然后:

$(function () {
    SomeFunction({
        name1:false,
        name2:false,
        name3:false,
        name4:true
    });
});
丰赞
2023-03-14

真正的命名参数在 JavaScript 和 TypeScript 中都不存在,但您可以使用解构来模拟命名参数:

interface Names {
    name1: boolean
    name2: boolean
    name3: boolean
    name4: boolean
}

function myFunction({name1, name2, name3, name4}: Names) {
    // name1, etc. are boolean
}

注意:名称类型实际上是可选的。以下 JavaScript 代码(不键入)在 TS 中有效:

function myFunction({name1, name2, name3, name4}) {
    // name1, etc. are of type any
}
 类似资料:
  • 我有一个在 XML 配置中定义的Hibernate命名查询。 查询会生成一个关于个人人口统计信息的汇总报告。我们住在哪里,那个人可能住在一个省或一个县。 我想知道是否有可能根据hibernate查询参数,按省或县聚合查询。 这是我尝试过的: 参数名称为:groupReportBy。如果我硬编码“省”而不是参数名称,则此查询将起作用,但如果我按照上面显示的方式运行它,则会出现以下错误: 我从Java

  • 问题内容: 我正在尝试学习打字稿和angularjs(因此我是JavaScript的菜鸟) 通过angularjs教程,我看到他们做了这样的事情: 在普通的javascript中: 更重要的是,这些参数可以按任何顺序排列(或根本不按顺序排列),而Project实际上是用户定义的变量/类型。angularjs框架能够将参数映射到实际对象。 那么现在到Typescript,我该如何重新创建这种类型的功

  • 4.2. 使用可选参数和命名参数 Python 允许函数参数有缺省值;如果调用函数时不使用参数,参数将获得它的缺省值。此外,通过使用命名参数还可以以任意顺序指定参数。SQL Server Transact/SQL 中的存储过程也可以做到这些;如果你是脚本高手,你可以略过这部分。 info 函数就是这样一个例子,它有两个可选参数。 def info(object, spacing=10, coll

  • 问题内容: 我将Oracle用作数据库层,但是问题是通过OCI8(我做了一个PDO用户空间驱动程序)的oracle仅支持SQL语句中的命名参数,不支持定位的参数。(例如使用多个?) 从根本上讲,是Laravel的Eloquent生成了SQL,但是我找不到任何有关如何重写参数构造的文档。 我希望能够以“:name”的形式创建命名参数,而不是放置多个“?” 整个查询。 能做到吗?我的猜测是它与数据库语

  • 我想用命名参数实现一个UPDATE SET语句?可能吗? 对于这样的对象: 这是我的猜测: 对象字段可能会根据发送的请求而有所不同,因此我不想对中的参数进行“硬编码”。

  • 问题内容: 在Python中,您可能有一个函数定义: 可以通过以下任何一种方式调用: 多亏了Python允许任意顺序的参数(只要它们被命名)。 我们遇到的问题是,随着一些更大的函数的增长,人们可能会在和之间添加参数,这意味着错误的值可能会传递给未命名的参数。另外,有时不清楚需要输入什么。我们正在寻找一种方法来强迫人们命名某些参数- 不仅是编码标准,还是理想的标志或pydev插件? 因此,在上述4个