从零到一: 创建一个 TypeScript 7 项目

准备开发环境

请先确保已安装 Node.js,检查本地版本:

bash 复制代码
node --version

初始化项目:

bash 复制代码
mkdir new-typescript-project
cd new-typescript-project
npm init --yes

项目完成后的主要目录如下:

plain 复制代码
├── package.json
├── tsconfig.json
├── webpack.config.js
└── src
    └── index.ts

安装 TypeScript 和开发工具

TypeScript 7 的编译器使用 Go 重写为原生实现。tsc 可以直接执行编译和类型检查,但 TypeScript 7 暂未提供稳定的编程 API。ts-loader 和 typescript-eslint 等工具仍需通过编程 API 调用编译器,因此暂时依赖 TypeScript 6。

为帮助现有工具平稳过渡,TypeScript 团队发布了 @typescript/typescript6 兼容包。该兼容包可以让 TypeScript 7 的 tsc 与依赖 TypeScript 6 API 的工具并行运行。具体背景参阅 TypeScript 7.0 发布公告

本项目据此并行安装两个版本:

  • @typescript/nativetypescript@7.0.2 的别名,负责 tsc、直接构建、监听和类型检查。
  • typescript@typescript/typescript6@6.0.2 的别名,向 webpack、ts-loader 和 typescript-eslint 提供兼容 API。该依赖还提供 tsc6 命令,对应的编译器版本为 6.0.3。

安装开发依赖:

bash 复制代码
npm install --save-dev \
  "@eslint/js@^9.39.5" \
  "@typescript/native@npm:typescript@7.0.2" \
  "eslint@^9.39.5" \
  "eslint-config-prettier@^10.1.8" \
  "prettier@^3.9.6" \
  "ts-loader@^9.6.2" \
  "typescript@npm:@typescript/typescript6@6.0.2" \
  "typescript-eslint@^8.67.0" \
  "webpack@^5.109.2" \
  "webpack-cli@^7.2.2"

安装完成后,package.json 会包含以下开发依赖:

json 复制代码
{
  "devDependencies": {
    "@eslint/js": "^9.39.5",
    "@typescript/native": "npm:typescript@7.0.2",
    "eslint": "^9.39.5",
    "eslint-config-prettier": "^10.1.8",
    "prettier": "^3.9.6",
    "ts-loader": "^9.6.2",
    "typescript": "npm:@typescript/typescript6@6.0.2",
    "typescript-eslint": "^8.67.0",
    "webpack": "^5.109.2",
    "webpack-cli": "^7.2.2"
  }
}

随后,可以检查两个编译器的版本:

bash 复制代码
npm exec -- tsc --version
npm exec -- tsc6 --version

预期输出:

plain 复制代码
Version 7.0.2
Version 6.0.3

配置 TypeScript 7

package.json 中声明 ESM,并设置项目的入口文件和发布内容:

json 复制代码
{
  "type": "module",
  "main": "dist/index.js",
  "types": "dist/index.d.ts",
  "files": ["dist", "src"]
}

创建 tsconfig.json:

json 复制代码
{
  "compilerOptions": {
    "rootDir": "src",
    "outDir": "dist",
    "module": "NodeNext",
    "target": "ES2023",
    "types": [],
    "sourceMap": true,
    "inlineSources": true,
    "declaration": true,
    "declarationMap": true,
    "noUncheckedIndexedAccess": true,
    "exactOptionalPropertyTypes": true,
    "strict": true,
    "verbatimModuleSyntax": true,
    "isolatedModules": true,
    "noUncheckedSideEffectImports": true,
    "moduleDetection": "force",
    "skipLibCheck": true
  },
  "include": ["src/**/*.ts"],
  "exclude": ["node_modules", "dist"]
}

tsconfig.json 是 TypeScript 7 直接构建和 webpack 构建共用的项目配置。NodeNext 会结合 package.json 中的 "type": "module" 判断模块格式,使 dist/index.js 保持 ESM 格式。

编写并编译 TypeScript

创建 src/index.ts:

typescript 复制代码
const ProjectName = "new-typescript-project";

function say(): string {
  return `This project is ${ProjectName}.`;
}

console.log(say());

package.json 中定义直接构建、监听和类型检查脚本:

json 复制代码
{
  "scripts": {
    "build:ts": "tsc --project tsconfig.json",
    "watch": "tsc --project tsconfig.json --watch",
    "typecheck": "tsc --project tsconfig.json --noEmit"
  }
}

运行直接构建:

bash 复制代码
npm run build:ts

TypeScript 7 会生成 dist/index.js、声明文件、声明映射和源码映射。dist/index.js 的内容如下:

javascript 复制代码
const ProjectName = "new-typescript-project";
function say() {
    return `This project is ${ProjectName}.`;
}
console.log(say());
export {};
//# sourceMappingURL=index.js.map

运行编译结果:

bash 复制代码
node dist/index.js

输出如下:

plain 复制代码
This project is new-typescript-project.

开发期间可以启动监听模式:

bash 复制代码
npm run watch

只检查类型而不写入文件:

bash 复制代码
npm run typecheck

使用 webpack 打包

对于当前 Node.js 项目,TypeScript 7 直接编译已经足够。webpack 是一条可选的构建路径。

tsc 负责类型检查和 JavaScript 编译,也会生成声明文件与源码映射。在本项目的 NodeNext 配置下,tsc 会保留模块边界,不会把入口文件及其依赖合并为单个文件。

webpack 会从入口开始分析模块依赖,并将项目代码和引用的模块合并为 dist/bundle.js。对于包含多个模块或第三方依赖的应用,单文件通常更便于交付。

配置相应的 loader 或 plugin 后,webpack 还可以处理 CSS、图片等资源。本文没有启用这些能力。

webpack 通过 ts-loader 加载 TypeScript。ts-loader 会从名为 typescript 的依赖中获取 TypeScript 6 兼容 API。webpack 仍使用同一个 tsconfig.json。更多配置方式请参阅 webpack TypeScript 指南

创建 ESM 格式的 webpack.config.js:

javascript 复制代码
import path from "node:path";
import { fileURLToPath } from "node:url";

const currentDirectory = path.dirname(fileURLToPath(import.meta.url));

export default {
  mode: "production",
  entry: "./src/index.ts",
  devtool: "source-map",
  output: {
    filename: "bundle.js",
    path: path.resolve(currentDirectory, "dist"),
  },
  module: {
    rules: [
      {
        test: /\.tsx?$/,
        use: {
          loader: "ts-loader",
          options: {
            compilerOptions: {
              declaration: false,
              declarationMap: false,
            },
          },
        },
        exclude: /node_modules/,
      },
    ],
  },
  resolve: {
    extensions: [".ts", ".tsx"],
  },
};

webpack 构建会关闭声明文件输出。包文件和声明文件仍由 TypeScript 7 直接构建生成。

添加 webpack 构建脚本:

json 复制代码
{
  "scripts": {
    "build:webpack": "webpack --config webpack.config.js"
  }
}

运行构建并执行生成的 bundle:

bash 复制代码
npm run build:webpack
node dist/bundle.js

webpack 会同时生成 dist/bundle.jsdist/bundle.js.map

配置 ESLint

ESLint 使用 flat config,并组合 @eslint/js 和 typescript-eslint 的推荐规则。具体配置方式参阅 typescript-eslint 入门指南

运行检查:

bash 复制代码
npm run lint

完整验证项目

check 是仓库健康检查。该脚本会依次检查格式、代码质量和类型,然后运行两条构建路径:

json 复制代码
{
  "scripts": {
    "check": "npm run format:check && npm run lint && npm run typecheck && npm run build:ts && npm run build:webpack"
  }
}

执行完整检查:

bash 复制代码
npm run check

构建完成后,分别运行两个文件并比较输出:

bash 复制代码
node dist/index.js
node dist/bundle.js

两个命令都应输出:

plain 复制代码
This project is new-typescript-project.

参考资料

附录

案例: github.com/chengchuu/n...

版权声明

本文为原创文章,作者保留版权。转载请保留本文完整内容,并以超链接形式注明作者及原文出处。

作者: 除除 原文: blog.mazey.net/6532.html

相关推荐
lerhxx3 小时前
我用 R3F 手搓了一个能走进去的 3D 迷宫简历(上):从选型架构到迷宫生成算法
前端·javascript·three.js
还有多久拿退休金3 小时前
不调多模态,纯文本大模型如何给系统操作配上截图
前端·llm·aigc
hunterandroid4 小时前
HarmonyOS WebSocket 实战:断线重连、心跳保活与连接状态机设计
前端
hunterandroid4 小时前
StateFlow 与 SharedFlow 的边界:状态与事件的正确建模
android·前端
心念科技4 小时前
1、搜索表单 xnSearch(基于:心念后台,后端 Java 21 + Spring Boot 4 + Spring Cloud,前端提供 ReactVue3+TS、Vue3+JS、Vue2+JS
前端
计算机魔术师5 小时前
Dwarkesh Patel 对 OpenAI/Hugging Face 事件的爆款解读被指危险误导
前端
自进化Agent智能体6 小时前
Hermes GitHub PR 审查 —— 自动化代码评审
前端
涛涛ing8 小时前
OpenAI Astra 泄露:零样本生成 3D 网页,前端开发者慌了吗?
前端
ssshooter8 小时前
现在网页都能提供 MCP 了?!
前端·人工智能·程序员