TypeScript Go贡献指南:如何向开源项目提交代码
概述
TypeScript Go(代号Corsa)是微软正在开发的TypeScript原生Go语言移植版本,旨在提供与现有TypeScript相同的功能,但使用Go语言实现以获得更好的性能和原生体验。作为开源项目,它欢迎开发者贡献代码,本文将详细介绍如何为这个项目做出贡献。
环境准备
系统要求
在开始贡献之前,请确保您的开发环境满足以下要求:
| 工具 | 版本要求 | 安装指南 |
|---|---|---|
| Go | 1.25或更高 | 官方下载 |
| Rust | 1.85或更高 | 官方安装 |
| Node.js | 最新LTS版本 | Node.js官网 |
| hereby | 最新版本 | npm install -g hereby |
项目克隆
正确克隆项目是贡献的第一步,由于项目包含子模块,需要使用特殊命令:
# 使用递归克隆确保子模块正确初始化
git clone --recurse-submodules https://gitcode.com/GitHub_Trending/ty/typescript-go.git
# 如果已经克隆但未初始化子模块
git submodule update --init --recursive
开发工作流
1. 代码构建
项目使用hereby作为构建工具,提供与TypeScript原仓库相似的开发体验:
# 安装依赖
npm ci
# 构建tsgo二进制文件
hereby build
# 运行测试
hereby test
# 代码格式化
hereby format
# 代码检查
hereby lint
# 安装额外工具
hereby install-tools
# 生成Go代码(如诊断信息)
hereby generate
2. 本地测试
项目支持标准的Go工具链,您也可以直接使用Go命令:
# 使用Go构建
go build ./cmd/tsgo
# 运行所有测试
go test ./...
# 运行特定包测试
go test ./internal/ast/...
3. LSP服务器调试
对于语言服务器协议相关的开发,可以使用VS Code进行调试:
- 在项目根目录打开VS Code:
code . - 复制
.vscode/launch.template.json到.vscode/launch.json - 按F5启动调试会话
代码贡献流程
1. 寻找贡献点
2. 功能状态检查
在开始贡献前,请检查目标功能的状态:
| 功能领域 | 状态 | 贡献建议 |
|---|---|---|
| 程序创建 | ✅ 完成 | 可报告bug,不建议重构 |
| 解析/扫描 | ✅ 完成 | 可报告bug |
| 类型检查 | ✅ 完成 | 可报告bug |
| JavaScript推断 | 🔄 进行中 | 欢迎贡献 |
| 声明发射 | 🔄 进行中 | 欢迎贡献 |
| 代码发射 | 🔄 进行中 | 欢迎贡献 |
| 监视模式 | ⚠️ 原型 | 仅报告崩溃 |
| 语言服务 | 🔄 进行中 | 欢迎贡献 |
| API | ❌ 未就绪 | 暂不接收贡献 |
3. 代码规范
Go代码风格
项目遵循标准的Go编码规范,并使用gofumpt进行格式化:
// 正确的函数声明格式
func (c *Checker) checkBinaryExpression(
expr *ast.BinaryExpression,
context checkingContext,
) (*types.Type, *diagnostics.Diagnostic) {
// 使用明确的错误处理
if err := validateExpression(expr); err != nil {
return nil, diagnostics.NewError(err)
}
// ...
}
测试要求
所有代码变更必须包含相应的测试用例:
func TestBinaryExpressionChecking(t *testing.T) {
testCases := []struct {
name string
input string
expected string
}{
{
name: "simple addition",
input: "1 + 2",
expected: "number",
},
{
name: "string concatenation",
input: `"hello" + "world"`,
expected: "string",
},
}
for _, tc := range testCases {
t.Run(tc.name, func(t *testing.T) {
result := parseAndCheck(tc.input)
if result != tc.expected {
t.Errorf("Expected %s, got %s", tc.expected, result)
}
})
}
}
4. 提交信息规范
提交信息应遵循约定式提交规范:
feat(parser): add support for optional chaining syntax
- Implement ?. operator parsing
- Add corresponding AST node types
- Include comprehensive test cases
Fixes #123
常见的提交类型包括:
feat: 新功能fix: bug修复docs: 文档更新test: 测试相关refactor: 重构代码chore: 构建过程或辅助工具变更
法律要求
贡献者许可协议(CLA)
所有贡献者必须签署Microsoft贡献者许可协议:
- 提交Pull Request时,CLA机器人会自动检查
- 如果需要签署CLA,机器人会提供详细指引
- 只需签署一次,适用于所有Microsoft开源项目
行为准则
项目遵循Microsoft开源行为准则,要求所有参与者:
- 保持尊重和专业的交流
- 欢迎不同背景和经验的贡献者
- 建设性地处理分歧
常见问题解答
Q: 我应该从哪里开始贡献?
A: 建议从文档改进、测试用例添加或标记为"进行中"的功能开始。
Q: 如何处理TypeScript子模块?
A: 子模块指向正在移植的TypeScript提交,通常不需要手动修改。如果遇到子模块问题,运行git submodule update --init --recursive。
Q: 我的Pull Request需要多长时间审核?
A: 审核时间因变更复杂度和维护者可用性而异,通常需要1-2周。
Q: 如何知道我的变更是否被接受?
A: 维护者会在Pull Request中提供反馈,可能包括代码审查意见、测试要求或合并确认。
最佳实践
1. 小步提交
将大型变更分解为多个小提交,每个提交解决一个具体问题:
# 不好的做法 - 大型单次提交
git commit -m "实现整个模块系统"
# 好的做法 - 多个小提交
git commit -m "feat(parser): 添加模块导入解析"
git commit -m "feat(binder): 实现模块符号绑定"
git commit -m "test(module): 添加模块解析测试用例"
2. 测试驱动开发
在实现功能前先编写测试用例:
// 先写测试
func TestNewFeature(t *testing.T) {
want := expectedResult
got := newFeature(input)
if got != want {
t.Errorf("newFeature() = %v, want %v", got, want)
}
}
// 再实现功能
func newFeature(input string) string {
// 实现逻辑
}
3. 文档更新
代码变更应同步更新相关文档:
- README中的功能说明
- CONTRIBUTING.md中的流程变更
- 代码中的注释和Godoc
总结
为TypeScript Go项目贡献代码是一个很好的学习机会,既能深入了解TypeScript编译器的工作原理,又能参与大型开源项目的开发。记住:
- 从小处着手 - 从简单的bug修复或文档改进开始
- 遵循规范 - 严格遵守代码风格和提交规范
- 充分测试 - 确保所有变更都有相应的测试覆盖
- 保持耐心 - 开源项目审核需要时间,积极回应反馈
通过遵循本指南,您将能够为TypeScript Go项目做出有价值的贡献,并成为开源社区的重要成员。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



