# MSBuild 中的编译器选项

# 概述

如果你有一个基于 MSBuild 的项目,它使用了 TypeScript,例如 ASP.NET Core 项目,你可以通过两种方式配置 TypeScript。通过 tsconfig.json或通过项目设置。

# 使用 tsconfig.json

我们建议尽可能为您的项目使用 tsconfig.json。要将一个项目添加到现有项目,请在项目中添加一个新项目,在现代版本的 Visual Studio 中称为 "TypeScript JSON Configuration File"。

然后,新的 tsconfig.json将用作特定于 TypeScript 的构建信息(如文件和配置)的真实来源。可以学关于 TSConfigs 如何在这里工作 ,有综合参考这里。

# 使用项目设置

您还可以在项目的设置中定义 TypeScript 的配置。这是通过编辑 .csproj中的 XML 来定义 PropertyGroups来完成的,PropertyGroups描述了构建如何工作:


<PropertyGroup>
  <TypeScriptNoEmitOnError>true</TypeScriptNoEmitOnError>
  <TypeScriptNoImplicitReturns>true</TypeScriptNoImplicitReturns>
</PropertyGroup>

常见的 TypeScript 设置有一系列映射,这些设置直接映射到 TypeScript cli 选项 ,用于帮助您编写更易于理解的项目文件。您可以使用 TSConfig 参考手册 获取有关每个映射的值和默认值的更多信息。

# CLI 映射

MSBuild 配置名称 TSC 标志
<TypeScriptAllowJS> --allowJs
允许 JavaScript 文件成为程序的一部分。使用 checkJS 选项从这些文件中获取错误。
<TypeScriptRemoveComments> --removeComments
禁用发出评论。
<TypeScriptNoImplicitAny> --noImplicitAny
为隐含 any 类型的表达式和声明启用错误报告。
<TypeScriptGeneratesDeclarations> --declaration
从项目中的 TypeScript 和 JavaScript 文件生成 .d.ts 文件。
<TypeScriptModuleKind> --module
指定生成什么模块代码。
<TypeScriptJSXEmit> --jsx
指定生成的 JSX 代码。
<TypeScriptOutDir> --outDir
为所有发出的文件指定一个输出文件夹。
<TypeScriptSourceMap> --sourcemap
为发出的 JavaScript 文件创建源映射文件。
<TypeScriptTarget> --target
为发出的 JavaScript 设置 JavaScript 语言版本并包含兼容的库声明。
<TypeScriptNoResolve> --noResolve
禁止 imports、requires 或 <reference>s 扩展 TypeScript 应添加到项目中的文件数量。
<TypeScriptMapRoot> --mapRoot
指定调试器应该定位映射文件而不是生成的位置的位置。
<TypeScriptSourceRoot> --sourceRoot
指定调试器查找参考源代码的根路径。
<TypeScriptCharset> --charset
不再支持。在早期版本中,手动设置读取文件的文本编码。
<TypeScriptEmitBOM> --emitBOM
在输出文件的开头发出一个 UTF-8 字节顺序标记 (BOM)。
<TypeScriptNoLib> --noLib
禁用包含任何库文件,包括默认的 lib.d.ts。
<TypeScriptPreserveConstEnums> --preserveConstEnums
禁用擦除生成代码中的 const enum 声明。
<TypeScriptSuppressImplicitAnyIndexErrors> --suppressImplicitAnyIndexErrors
在索引缺少索引签名的对象时抑制 noImplicitAny 错误。
<TypeScriptNoEmitHelpers> --noEmitHelpers
禁止在编译输出中生成自定义帮助函数,如 __extends。
<TypeScriptInlineSourceMap> --inlineSourceMap
在发出的 JavaScript 中包含 sourcemap 文件。
<TypeScriptInlineSources> --inlineSources
在发出的 JavaScript 内的源映射中包含源代码。
<TypeScriptNewLine> --newLine
设置用于发出文件的换行符。
<TypeScriptIsolatedModules> --isolatedModules
确保每个文件都可以安全地转译,而无需依赖其他导入。
<TypeScriptEmitDecoratorMetadata> --emitDecoratorMetadata
为源文件中的修饰声明发出设计类型元数据。
<TypeScriptRootDir> --rootDir
在源文件中指定根文件夹。
<TypeScriptExperimentalDecorators> --experimentalDecorators
启用对 TC39 第 2 阶段草稿装饰器的实验性支持。
<TypeScriptModuleResolution> --moduleResolution
指定 TypeScript 如何从给定的模块说明符中查找文件。
<TypeScriptSuppressExcessPropertyErrors> --suppressExcessPropertyErrors
在创建对象字面期间禁用过多属性错误的报告。
<TypeScriptReactNamespace> --reactNamespace
指定为 createElement 调用的对象。这仅适用于针对 react JSX 触发的情况。
<TypeScriptSkipDefaultLibCheck> --skipDefaultLibCheck
跳过 TypeScript 中包含的类型检查 .d.ts 文件。
<TypeScriptAllowUnusedLabels> --allowUnusedLabels
禁用未使用标签的错误报告。
<TypeScriptNoImplicitReturns> --noImplicitReturns
为未在函数中显式返回的代码路径启用错误报告。
<TypeScriptNoFallthroughCasesInSwitch> --noFallthroughCasesInSwitch
在 switch 语句中启用失败案例的错误报告。
<TypeScriptAllowUnreachableCode> --allowUnreachableCode
禁用无法访问代码的错误报告。
<TypeScriptForceConsistentCasingInFileNames> --forceConsistentCasingInFileNames
确保进口中的大小写正确。
<TypeScriptAllowSyntheticDefaultImports> --allowSyntheticDefaultImports
当模块没有默认导出时允许 'import x from y'。
<TypeScriptNoImplicitUseStrict> --noImplicitUseStrict
禁止在发出的 JavaScript 文件中添加 'use strict' 指令。
<TypeScriptLib> --lib
指定一组描述目标运行时环境的捆绑库声明文件。
<TypeScriptBaseUrl> --baseUrl
指定基目录以解析非相对模块名称。
<TypeScriptDeclarationDir> --declarationDir
指定生成的声明文件的输出目录。
<TypeScriptNoImplicitThis> --noImplicitThis
当 this 被赋予类型 any 时启用错误报告。
<TypeScriptSkipLibCheck> --skipLibCheck
跳过类型检查所有 .d.ts 文件。
<TypeScriptStrictNullChecks> --strictNullChecks
类型检查时,请考虑 null 和 undefined。
<TypeScriptNoUnusedLocals> --noUnusedLocals
未读取局部变量时启用错误报告。
<TypeScriptNoUnusedParameters> --noUnusedParameters
未读取函数参数时引发错误
<TypeScriptAlwaysStrict> --alwaysStrict
确保始终发出 'use strict'。
<TypeScriptImportHelpers> --importHelpers
允许每个项目从 tslib 导入帮助函数一次,而不是在每个文件中包含它们。
<TypeScriptJSXFactory> --jsxFactory
指定针对 React JSX 触发时使用的 JSX 工厂函数,例如 'React.createElement' 或 'h'
<TypeScriptStripInternal> --stripInternal
禁用在 JSDoc 注释中发出 @internal 的声明。
<TypeScriptCheckJs> --checkJs
在类型检查的 JavaScript 文件中启用错误报告。
<TypeScriptDownlevelIteration> --downlevelIteration
为迭代发出更合规但冗长且性能更低的 JavaScript。
<TypeScriptStrict> --strict
启用所有严格的类型检查选项。
<TypeScriptNoStrictGenericChecks> --noStrictGenericChecks
禁用对函数类型中的泛型签名的严格检查。
<TypeScriptPreserveSymlinks> --preserveSymlinks
禁用解析符号链接到他们的真实路径。这与 node 中的相同标志相关。
<TypeScriptStrictFunctionTypes> --strictFunctionTypes
分配函数时,检查以确保参数和返回值是子类型兼容的。
<TypeScriptStrictPropertyInitialization> --strictPropertyInitialization
检查已声明但未在构造函数中设置的类属性。
<TypeScriptESModuleInterop> --esModuleInterop
发出额外的 JavaScript 以简化对导入 CommonJS 模块的支持。这启用 allowSyntheticDefaultImports 以实现类型兼容性。
<TypeScriptEmitDeclarationOnly> --emitDeclarationOnly
只输出 d.ts 文件,不输出 JavaScript 文件。
<TypeScriptKeyofStringsOnly> --keyofStringsOnly
使 keyof 只返回字符串而不是字符串、数字或符号。旧版选项。
<TypeScriptUseDefineForClassFields> --useDefineForClassFields
发出符合 ECMAScript 标准的类字段。
<TypeScriptDeclarationMap> --declarationMap
为 d.ts 文件创建源映射。
<TypeScriptResolveJsonModule> --resolveJsonModule
启用导入 .json 文件
<TypeScriptStrictBindCallApply> --strictBindCallApply
检查 bind、call 和 apply 方法的参数是否与原始函数匹配。
<TypeScriptNoEmitOnError> --noEmitOnError
如果报告任何类型检查错误,则禁用发出文件。

# 附加标志

因为 MSBuild 系统将参数直接传递给 TypeScript CLI,所以您可以使用选项 TypeScriptAdditionalFlags来提供没有上述映射的特定标志。

例如,这将打开 noPropertyAccessFromIndexSignature


<TypeScriptAdditionalFlags> $(TypeScriptAdditionalFlags) --noPropertyAccessFromIndexSignature</TypeScriptAdditionalFlags>

# 调试和发布版本

您可以使用 PropertyGroup 条件来定义不同的配置集。例如,一个常见的任务是在生产中剥离评论和源图。在此示例中,我们定义了一个具有不同 TypeScript 配置的调试和发布属性组:


<PropertyGroup Condition="'$(Configuration)' == 'Debug'">
  <TypeScriptRemoveComments>false</TypeScriptRemoveComments>
  <TypeScriptSourceMap>true</TypeScriptSourceMap>
</PropertyGroup>

<PropertyGroup Condition="'$(Configuration)' == 'Release'">
  <TypeScriptRemoveComments>true</TypeScriptRemoveComments>
  <TypeScriptSourceMap>false</TypeScriptSourceMap>
</PropertyGroup>

<Import
    Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\TypeScript\Microsoft.TypeScript.targets"
    Condition="Exists('$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\TypeScript\Microsoft.TypeScript.targets')" />

# ToolsVersion

项目文件中 &lt;TypeScriptToolsVersion>1.7</TypeScriptToolsVersion&gt;属性的值标识了用于构建的编译器版本(本例中为 1.7)。这允许项目在不同机器上针对相同版本的编译器进行构建。

如果不指定 TypeScriptToolsVersion,将使用机器上安装的最新编译器版本进行构建。

使用较新版本 TS 的用户将在首次加载时看到升级项目的提示。

# TypeScriptCompileBlocked

如果您使用不同的构建工具来构建您的项目(例如 gulp、grunt 等)和 VS 以获得开发和调试体验,请在您的项目中设置 &lt;TypeScriptCompileBlocked>true</TypeScriptCompileBlocked&gt;。这应该为您提供所有的编辑支持,但在您按下 F5 时不会为您提供构建支持。

# TypeScriptEnableIncrementalMSBuild(TypeScript 4.2 Beta 及更高版本)

默认情况下,MSBuild 将尝试仅在自上次编译后更新项目的源文件时才运行 TypeScript 编译器。但是,如果此行为导致问题,例如启用 TypeScript 的 incremental 选项,请设置 &lt;TypeScriptEnableIncrementalMSBuild>false</TypeScriptEnableIncrementalMSBuild&gt;以确保每次运行 MSBuild 都会调用 TypeScript 编译器。

Last Updated: 5/25/2023, 2:35:11 PM