

# 使用 TypeScript 构建 Lambda 函数
<a name="lambda-typescript"></a>

你可以使用 Node.js 运行时在 AWS Lambda 中运行 TypeScript 代码。由于 Node.js 不会在本机运行 TypeScript 代码，因此必须首先将 TypeScript 代码转换为 JavaScript。然后，可以使用 JavaScript 文件将您的函数代码部署到 Lambda。您的代码将在包含适用于 JavaScript 的 AWS SDK 的环境中运行，其中包含来自您管理的 AWS Identity and Access Management (IAM) 角色的凭证。要了解有关 Node.js 运行时随附的 SDK 版本的更多信息，请参阅 [包含运行时的 SDK 版本](lambda-nodejs.md#nodejs-sdk-included)。

Lambda 支持以下 Node.js 运行时。


| 名称 | 标识符 | 操作系统 | 弃用日期 | 阻止函数创建 | 阻止函数更新 | 
| --- | --- | --- | --- | --- | --- | 
| Node.js 24 | `nodejs24.x` | Amazon Linux 2023 |  2028 年 4 月 30 日  |  2028 年 6 月 1 日  |  2028 年 7 月 1 日  | 
| Node.js 22 | `nodejs22.x` | Amazon Linux 2023 |  2027 年 4 月 30 日  |  2027 年 6 月 1 日  |  2027 年 7 月 1 日  | 
| Node.js 20 | `nodejs20.x` | Amazon Linux 2023 |  2026 年 4 月 30 日  |  2026 年 8 月 31 日  |  Sep 30, 2026  | 

**Topics**
+ [设置 TypeScript 开发环境](#typescript-dev)
+ [Lambda 的类型定义](#typescript-type-definitions)
+ [定义采用 TypeScript 的 Lambda 函数处理程序](typescript-handler.md)
+ [使用 .zip 文件归档部署在 Lambda 中转换的 TypeScript 代码](typescript-package.md)
+ [使用容器镜像在 Lambda 中部署转换后的 TypeScript 代码](typescript-image.md)
+ [使用 Lambda 上下文对象检索 TypeScript 函数信息](typescript-context.md)
+ [TypeScript Lambda 函数日志记录和监控](typescript-logging.md)
+ [追踪 AWS Lambda 中的 TypeScript 代码](typescript-tracing.md)

## 设置 TypeScript 开发环境
<a name="typescript-dev"></a>

使用本地集成式开发环境（IDE）或文本编辑器来编写 TypeScript 函数代码。您无法在 Lambda 控制台上创建 TypeScript 代码。

您可以使用 [esbuild](https://esbuild.github.io/) 或 Microsoft 的 TypeScript 编译器（`tsc`）将您的 TypeScript 代码转换为 JavaScript。[AWS Serverless Application Model（AWS SAM）](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-getting-started.html) 和 [AWS Cloud Development Kit (AWS CDK)](https://docs.aws.amazon.com/cdk/v2/guide/getting_started.html) 都使用 esbuild。

在使用 esbuild 时，请注意以下事项：
+ 有几个 [TypeScript 注意事项](https://esbuild.github.io/content-types/#typescript-caveats)。
+ 您必须配置 TypeScript 转换设置，以匹配您计划使用的 Node.js 运行时。有关更多信息，请参阅 esbuild 文档中的[目标](https://esbuild.github.io/api/#target)。有关演示如何将 Lambda 支持的特定 Node.js 版本设为目标的 **tsconfig.json** 文件示例，请参阅 [TypeScript GitHub 存储库](https://github.com/tsconfig/bases/blob/main/bases/node14.json)。
+ esbuild 不执行类型检查。要检查类型，请使用 `tsc` 编译器。运行 `tsc -noEmit` 或将 `"noEmit"` 参数添加到您的 **tsconfig.json** 文件，如以下示例中所示。这会将 `tsc` 配置为不发出 JavaScript 文件。在检查类型后，使用 esbuild 将 TypeScript 文件转换为 JavaScript。

**Example tsconfig.json**  

```
 {
  "compilerOptions": {
    "target": "es2020",
    "strict": true,
    "preserveConstEnums": true,
    "noEmit": true,
    "sourceMap": false,
    "module":"commonjs",
    "moduleResolution":"node",
    "esModuleInterop": true, 
    "skipLibCheck": true,
    "forceConsistentCasingInFileNames": true, 
    "isolatedModules": true, 
  },
  "exclude": ["node_modules", "**/*.test.ts"]
}
```

## Lambda 的类型定义
<a name="typescript-type-definitions"></a>

[@types/aws-lambda](https://www.npmjs.com/package/@types/aws-lambda) 程序包为 Lambda 函数提供类型定义。如果您的函数使用以下任何一项，请安装此程序包：
+ 常见 AWS 事件源，例如：
  + `APIGatewayProxyEvent`：适用于 [Amazon API Gateway 代理集成](https://docs.aws.amazon.com/apigateway/latest/developerguide/set-up-lambda-proxy-integrations.html) 
  + `SNSEvent`：适用于 [Amazon Simple Notification Service 通知](with-sns.md)
  + `SQSEvent`：适用于 [Amazon Simple Queue Service 消息](with-sqs.md)
  + `S3Event`：适用于 [S3 触发事件](with-s3.md)
  + `DynamoDBStreamEvent`：适用于 [Amazon DynamoDB Streams](with-ddb.md)
+ Lambda [上下文](typescript-context.md)对象
+ [回调](typescript-handler.md#typescript-handler-callback)处理程序模式

要将 Lambda 类型定义添加到您的函数中，请将 `@types/aws-lambda` 作为开发依赖项进行安装：

```
npm install -D @types/aws-lambda
```

然后，从 `aws-lambda` 导入这些类型：

```
import { Context, S3Event, APIGatewayProxyEvent } from 'aws-lambda';

export const handler = async (event: S3Event, context: Context) => {
    // Function code
};
```

`import ... from 'aws-lambda'` 语句会导入类型定义。但它不会导入 `aws-lambda` npm 程序包，这是一个无关的第三方工具。有关更多信息，请参阅 DefinitelyTyped GitHub 存储库中的 [aws-lambda](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/aws-lambda)。

**注意**  
使用自己的自定义类型定义时，无需使用 [@types/aws-lambda](https://www.npmjs.com/package/@types/aws-lambda)。有关为事件对象定义其自身类型的示例函数，请参阅 [示例 TypeScript Lambda 函数代码](typescript-handler.md#typescript-example-code)。