You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让TypeScript函数参数默认添加readonly只读类型约束?

TypeScript函数参数默认设为只读类型的实现方案

目前TypeScript没有提供原生的tsconfig配置项直接实现全局函数参数自动转为只读类型,但可以通过以下几种方案实现需求:

  • ESLint规则强制约束+自动修复
    可以使用@typescript-eslint插件提供的prefer-readonly-parameter-types规则,开启后会自动检查所有函数的参数类型:如果参数为可变数组、可变对象类型,会直接抛出错误,同时支持自动修复,直接把你写的A[]转为readonly A[]/ReadonlyArray<A>,把Record<string, string>转为Readonly<Record<string, string>>,完全匹配你需要的代码转换效果。
    ESLint配置参考:
{
  "plugins": ["@typescript-eslint"],
  "rules": {
    "@typescript-eslint/prefer-readonly-parameter-types": ["error", {
      "checkParameterProperties": true,
      "ignoreInferredTypes": false
    }]
  }
}

配置后你给出的示例代码会直接触发ESLint报错,运行自动修复后就能得到你期望的转换结果:

// 修复前
function foo(a: A[], b: Record<string, string>) {
}
// 修复后
function foo(a: ReadonlyArray<A>, b: Readonly<Record<string, string>>) {
}
  • 自定义TS转换器实现编译期自动转换
    如果你不需要修改源码,希望编译阶段自动完成类型转换,可以基于ts-patch或者ttypescript编写自定义转换器,编译时遍历所有函数声明节点,自动给参数的数组类型包裹ReadonlyArray,给对象类型包裹Readonly工具类型,无侵入实现全局转换效果。
  • 类型声明兜底
    可以在global.d.ts中通过类型重写覆盖全局函数的类型定义,实现参数默认按只读校验,但该方案局限性高,容易和第三方库的类型声明冲突,不推荐生产环境使用。
  • 宏库实现
    如果你的项目接入了ts-macros这类TS宏工具,可以编写自定义函数宏,自动对入参类型做只读包装,不过需要给目标函数添加宏标记,无法自动处理所有无标记的函数。

内容的提问来源于stack exchange,提问作者Luke Miles

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 10:24:00