用途
strict-typing 是一个编码规范类技能,用于在类型化语言中强制实施完整类型标注。其核心原则是:类型是编译器验证的文档。该技能适用于 TypeScript、Python(带类型提示)、Go、Rust、Java、C# 以及任何类型化语言。
主要能力
该技能定义了一条明确规则:绝不使用 any、unknown 或等价的类型逃逸;始终提供显式、准确的类型;如有需要,愿意花费额外时间把类型写正确。
针对 TypeScript,技能列出了禁止模式(如 const data: any = fetchData();、const items: unknown[] = parseItems();、function process(input: any): any { }、const config = {} as any;、// @ts-ignore、// @ts-expect-error 除非确有需要并附文档)与必需模式(使用 interface 定义数据结构、使用泛型约束如 function process<T extends Processable>(input: T): ProcessResult<T>)。同时要求 tsconfig.json 开启严格模式,包括 strict、noImplicitAny、strictNullChecks、strictFunctionTypes、strictBindCallApply、strictPropertyInitialization、noImplicitThis、noImplicitReturns、noUncheckedIndexedAccess。
针对 Python,技能列出禁止模式(缺少类型提示的函数、返回 Any、from typing import Any 后使用 Any)与必需模式(使用 dataclass、TypeVar、Generic、Protocol 等),并给出严格的 mypy 配置示例,包括 strict、disallow_any_generics、disallow_untyped_defs、disallow_incomplete_defs、check_untyped_defs、disallow_untyped_decorators、warn_redundant_casts、warn_unused_ignores。
针对 Go,技能指出虽然 Go 是静态类型,但应避免 interface{} 和 any(Go 1.18+ 中 interface{} 的别名),优先使用具体接口或具体类型;当确实需要 interface{} 时,需记录原因并添加类型断言。
使用方式
该技能以规范形式被应用,资料中提到它由 issue-driven-development 在第 7 步应用。开发者按照技能中的规则、配置示例和检查清单在编码过程中执行。
对于第三方类型缺失,技能建议创建类型定义(如 declare module 'untyped-library')或向 DefinitelyTyped 贡献类型。对于动态数据(API 响应或解析的 JSON),建议定义预期结构、使用类型守卫进行运行时校验,或使用 Zod 进行运行时校验(通过 z.infer 从 schema 推导类型)。
当类型难以表达时,技能给出分步策略:第一步质疑设计;第二步使用泛型;第三步使用联合类型;第四步创建类型守卫;第五步(最后手段)记录并说明理由。技能强调 any 应极其罕见,并给出可接受的时间投入参考:简单接口 5 分钟、复杂泛型 30 分钟、类型守卫 15 分钟、库类型 1 小时;若耗时更长,可能需要重新考虑设计。
适用场景
适用于在类型化语言中编写代码的场景,尤其是需要自文档化代码、编译期错误捕获、重构安全性和更好 IDE 支持的项目。技能还列出提交前检查清单:无 any 类型、无未经类型守卫的 unknown、无 @ts-ignore 或 # type: ignore、所有函数参数有类型、所有函数返回值有类型、公开的接口/类型已导出、类型配置为严格。
限制
资料未提供该技能的安装命令、平台支持范围、收费信息或具体效果数据。技能中提到的“可接受时间”为参考性建议,并非强制标准。对于 any 真正不可避免的极少数情况,技能允许在充分记录和说明理由的前提下使用。