【问题标题】:Can a typescript parameter be annotated as const?可以将打字稿参数注释为 const 吗?
【发布时间】:2017-07-13 16:10:45
【问题描述】:

如果我不想在函数范围内更改参数的值,有没有办法用 Typescript 对其进行注释?

我试过了:

function walk(const fileName: string): string[] {
// -----------^
}

但它不起作用。

【问题讨论】:

  • 我不相信这是目前可能的。
  • 至少有一个选项可以使数组只读function foo(bar: readonly number[]) { }。此功能不限于函数声明,它会将可变数组转换为不可变数组。
  • wwo 对此提出警告:1. 它仍然允许您重新分配 bar = ...(它只会阻止 bar[i] = ...bar.pop() 等)。 2. readonly 很浅,所以如果你有一个对象数组而不是简单的数字,它不会阻止bar[i].whatever = ...。不幸的是,不变性是 TypeScript 仍然缺少很多有用的东西的一个领域!

标签: typescript


【解决方案1】:

现在没有办法,也可能不会,因为在ES6 中也不可能:

How to make function parameter constant in JavaScript?

无论如何,此解决方法都不适用于 TypeScript。

【讨论】:

  • 知道了。不幸的是,我看不到 JavaScript 解决方法如何与 Typescript 一起使用。首先,如果没有定义参数,TS 会报错error TS2554: Expected 0 arguments, but got 1,。其次,元组语法导致error TS2461: Type 'IArguments' is not an array type
  • @kiewic 它不适用于 TS。我指出这是不可能的,并且使用 TypeScript 的解决方法违反了函数的参数协定。
  • 我的错,我错过了你回答的那部分。感谢您的帮助。
  • @kiewic 你没有。它是在您发表评论后编辑的,因为我看到它可能不够清楚。
【解决方案2】:

Typescript 尚不支持函数参数中的const,但您可以使用readonly 参数。

Typescript 3.4 增加了对 readonly 数组和元组(还不是对象)的支持。

例子:

function foo(arr: readonly string[]) {}

function foo(pair: readonly [string, string]) {}

function foo(arr: ReadonlyArray<string>) {}

【讨论】:

【解决方案3】:

目前尚不支持,但您可以对此功能请求投赞成票并关注它以获取未来的任何更新:https://github.com/microsoft/TypeScript/issues/18497

与此同时,最好的办法是使用 linter 规则将参数默认设为 const,例如 ESLint's no-param-reassign rule。在任何需要将参数设为not const 的极少数情况下,您可以在重新分配它的每个位置使用eslint-disable-line,或者将整个函数包装在eslint-disable / eslint-enable 对中使 所有 其参数非 const。

【讨论】:

    猜你喜欢
    • 2016-11-17
    • 2021-06-09
    • 1970-01-01
    • 1970-01-01
    • 2023-01-04
    • 1970-01-01
    • 2020-05-22
    • 2021-09-06
    • 1970-01-01
    相关资源
    最近更新 更多