
开发工具CLILint格式化静态分析代码质量构建工具【免费下载链接】toolsUnified developer tools for JavaScript, TypeScript, and the web项目地址https://gitcode.com/gh_mirrors/to/tools点击查看免费下载noBannedTypes是 Rome当前仓库gh_mirrors/to/tools即 Unified developer tools for JavaScript, TypeScript, and the web在 TypeScript 语义分析中提供的一条 lint 规则自 v10.0.0 起进入 nursery试验阶段。它用于禁止三类容易引入类型事故的写法原始类型primitive type的大写别名如String、Boolean、过度宽泛的Function类型以及含义与直觉相悖的非空类型{}。读完本文你将掌握该规则的三条核心约束、两条内置例外、安全修复Safe fix的实际行为以及如何通过rome.json和 CLI 参数启用、关闭或调整这条规则。规则概述一条规则三类约束规则文档website/src/pages/lint/rules/noBannedTypes.md将其能力概括为一句话Disallow primitive type aliases and misleading types禁止原始类型别名和具有误导性的类型。具体拆解为以下三部分强制原始类型命名一致原始类型存在别名例如Number是number的别名。规则推荐统一使用小写原始类型名。禁止Function类型Function是宽松类型loosely typed被视为危险或有害的用法。它等价于使用了不安全any的(...rest: any[]) any。禁止具有误导性的非空类型{}在 TypeScript 中{}并不表示空对象而是表示除null和undefined之外的任何值例如下面的代码是完全合法的const n: {} 0该规则从 typescript-eslint 的 ban-types。规则在仓库中的定位所属分组lint/nursery试验性规则组注册于 crates/rome_js_analyze/src/semantic_analyzers/nursery.rs并在 crates/rome_diagnostics_categories/src/categories.rs 中登记了诊断分类。推荐启用规则声明中recommended: true见 no_banned_types.rs即按推荐配置运行时默认开启。实现方式规则的查询类型为SemanticTsBannedType其中TsBannedType是TsReferenceType | TsObjectType的联合节点见 no_banned_types.rs说明它运行在语义分析阶段会结合绑定信息binding model判断标识符是否为全局类型。约束一禁止原始类型大写别名TypeScript 中的原始类型拥有对应的大写包装器对象类型Number、Boolean、String、Symbol、BigInt、Object。这些大写形式作为类型注解使用时几乎总是错误的选择——它们描述的是包装器对象而非原始值且与团队其他成员书写的小写形式不一致。从源码看规则通过BannedType::from_str维护了一份完整的黑名单见 no_banned_types.rsfn from_str(s: str) - OptionSelf { Some(match s { BigInt Self::BigInt, Boolean Self::Boolean, Function Self::Function, Number Self::Number, Object Self::Object, String Self::String, Symbol Self::Symbol, {} Self::EmptyObject, _ return None, }) }对于这些原始类型别名诊断消息统一为 Use lowercase primitives for consistency.使用小写原始类型以保持一致并附带一条Safe fix安全修复把大写标识符原地替换为小写关键字。修复由fix_with()实现它把BigInt/Boolean/Number/String/Symbol映射到对应的语法关键字BIGINT_KW/BOOLEAN_KW/NUMBER_KW/STRING_KW/SYMBOL_KW再通过rome_js_factory生成新的引用标识符节点见 no_banned_types.rs。注意Function、Object和{}因为无法机械地改写为某个关键字不会提供安全修复。无效示例Invalidlet foo: String bar;运行规则后Rome 会报告如下诊断完整快照见 crates/rome_js_analyze/tests/specs/nursery/noBannedTypes/invalid.ts.snapnursery/noBannedTypes.js:1:10 lint/nursery/noBannedTypes FIXABLE ━━━━━━━━━━━━━━━━━━━━━━━━━ ✖ Dont use String as a type. 1 │ let foo: String bar; │ ^^^^^^ ℹ Use lowercase primitives for consistency. ℹ Safe fix: Use string instead 1 │ - let foo: String bar; 1 │ let foo: string bar;其他同类无效示例let bool true as Boolean; // 建议改为 boolean let invalidTuple: [string, Boolean] [foo, false]; // 建议改为 boolean规则对as断言、元组、泛型参数、类继承、接口实现等所有类型位置一视同仁。测试用例invalid.ts覆盖了函数参数、ArrayString、联合类型String | Object、泛型默认值class FooT String等大量场景。有效示例Validlet foo: string bar; let tuple: [boolean, string] [false, foo];关键例外允许用户自定义同名类型规则不是简单地见String就报。在run中规则先通过model.binding(reference_identifier).is_none()检查该标识符是否绑定了本地声明只有当它未被绑定即全局标识符时才触发诊断见 no_banned_types.rs。因此用户完全可以在局部作用域内合法地声明并使用自己的Number别名例如 valid.ts 中的用例namespace X { // Allow user aliases type Number number function f(): Number { return 0; } }这段代码不会触发noBannedTypes因为这里的Number绑定到了用户自定义的类型别名而非全局包装器类型。约束二禁止Function类型Function类型在 TypeScript 中几乎不提供任何类型信息它接受任意函数形态的值等价于(...rest: any[]) any底层依赖不安全的any。用它标注变量等于放弃了参数与返回值的所有静态检查是常见 bug 的来源。触发诊断时规则给出的提示为✖ Dont use Function as a type. ℹ Prefer explicitly define the function shape. This type accepts any function-like value, which can be a common source of bugs.例如以下代码会被报告见 invalid.tslet fn: Function () true;正确做法是显式声明函数形态例如() boolean、(x: number) string或使用函数接口。由于Function没有对应的安全关键字替换规则对它是只报告、不自动修复。约束三禁止误导性的非空类型{}这是最容易让人踩坑的一条。在 TypeScript 中{}表示除null和undefined之外的任何值不是空对象因此const n: {} 0完全合法但这几乎肯定不是写代码的人的本意。规则对此的报告如下对应 website/src/pages/lint/rules/noBannedTypes.md 中的示例✖ Dont use {} as a type. ℹ Prefer explicitly define the object shape. {} means any non-nullable value.如果需要真正表示空对象文档推荐使用以下两种等价写法之一{ [k: string]: never } Recordstring, never两条内置例外为避免误伤合理的泛型约束写法规则对{}给出了两个例外文档说明见 noBannedTypes.md实现见 no_banned_types.rs泛型约束用T extends {}将泛型参数限制为非空类型时允许。源码中通过检查ts_object_type.parent::TsTypeConstraintClause().is_none()来放行约束子句中的{}function fT extends {}(x: T) { assert(x ! null); }类型交叉intersection用T {}把某个类型收窄为其非空等价形式时允许。源码通过ts_object_type.parent::TsIntersectionTypeElementList().is_none()放行交叉类型成员列表中的{}type NonNullableMyType MyType {};这两个例外在 valid.ts 中都有对应测试type PhoneNumber number | null | undefined; type NonNullablePhoneNumber PhoneNumber {}; function consumeNonNullableValueT extends {}(value: T) {}对于最后一种交叉类型的场景如果只是想表达非空文档还建议直接用 TypeScript 自带的工具类型语义更清晰type NonNullableMyType NonNullableMyType;其余有效写法以下写法都不会触发规则测试见 valid.tslet f Object(); // 作为构造函数调用而非类型注解 let g Object.create(null); let h String(false); // 作为函数调用 let b: undefined; let c: null; let a: []; type Props { foo: string; } // 显式定义对象形状注意Object在作为函数或构造函数调用如Object()、String(false)时不受影响规则只拦截它作为类型注解出现的位置。配置与使用方式通过 rome.json 配置noBannedTypes属于linter.rules.nursery分组可在rome.json中按需开启/关闭或降级为警告{ linter: { rules: { nursery: { noBannedTypes: off } } } }取值为on | off | warn。由于该规则recommended: true在推荐配置下默认启用若希望关闭可将取值设为off。通过 CLI 参数配置从配置生成代码crates/rome_service/src/configuration/linter/rules.rs可以看到每条规则都对应一个命令行参数noBannedTypes对应rome check --linter-rules-nursery-no-banned-typeson src/ rome check --linter-rules-nursery-no-banned-typesoff src/ rome check --linter-rules-nursery-no-banned-typeswarn src/参数同样接受on|off|warn三种取值。noBannedTypes的启用状态最终会通过is_enabled()汇入规则过滤集合由分析框架统一调度见 rules.rs。针对单条规则的禁用与配置若只需临时禁用某一行或某个文件的该规则可参考项目文档中关于禁用 lint 规则与规则选项的通用说明linter 页面中的 Disable a lint rule 与 Rule options 章节行内禁用使用// rome-ignore lint/nursery/noBannedTypes: reason注释Rome 会据此跳过该行诊断规则选项通过配置对象为规则提供细化参数。源码阅读指引想深入理解这条规则建议按以下路径阅读仓库规则实现crates/rome_js_analyze/src/semantic_analyzers/nursery/no_banned_types.rs —— 完整包含declare_rule!宏声明、run查询与匹配、diagnostic诊断消息和action安全修复四个核心部分注册与分组crates/rome_js_analyze/src/semantic_analyzers/nursery.rs —— 规则模块的注册入口配置生成crates/rome_service/src/configuration/linter/rules.rs ——no-banned-types命令行参数与nursery.noBannedTypes配置字段的定义测试用例invalid.ts 与 valid.ts及其快照 invalid.ts.snap / valid.ts.snap —— 覆盖了全部禁止场景与例外场景是理解规则边界的直接素材。小结noBannedTypes通过三把闸门提升 TypeScript 代码的类型严谨性强制大写原始类型别名回归小写并提供安全修复、拒绝宽泛的Function、纠正对{}的误解同时为泛型约束与交叉类型保留例外。结合 no_banned_types.rs 的实现与 invalid.ts / valid.ts 的测试你可以准确预判它在自己代码库中的行为边界并借助rome.json或 CLI 参数按团队规范灵活调整。赞分享开发工具CLILint格式化静态分析代码质量构建工具【免费下载链接】toolsUnified developer tools for JavaScript, TypeScript, and the web项目地址https://gitcode.com/gh_mirrors/to/tools点击查看免费下载相关推荐fairseq 字节级子词神经机器翻译基于 IWSLT17 法英任务的 BBPE 完整实践指南fairseq 字节级子词神经机器翻译基于 IWSLT17 法英任务的 BBPE 完整实践指南 导读 本文以 fairseq 官方示例 byte_level_开发工具CLILint格式化静态分析代码质量构建工具Rome 的 useShorthandArrayType 规则用 T[] 简写统一 TypeScript 数组类型写法Rome 的 useShorthandArrayType 规则用 T 简写统一 TypeScript 数组类型写法 本文以 Rome当前仓库 gh_mirr开发工具CLILint格式化静态分析代码质量构建工具Rome Lint 规则详解noClassAssign —— 禁止重赋值类成员Rome Lint 规则详解noClassAssign —— 禁止重赋值类成员 本文以 website/src/pages/lint/rules/noClas开发工具CLILint格式化静态分析代码质量构建工具上一篇3步打造专属Electron开发脚手架Electron Fiddle模板深度定制指南下一篇Whiteboard架构解析实时协作白板的实现原理与技术栈创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考