# 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
项目文件中 <TypeScriptToolsVersion>1.7</TypeScriptToolsVersion>
属性的值标识了用于构建的编译器版本(本例中为 1.7)。这允许项目在不同机器上针对相同版本的编译器进行构建。
如果不指定 TypeScriptToolsVersion
,将使用机器上安装的最新编译器版本进行构建。
使用较新版本 TS 的用户将在首次加载时看到升级项目的提示。
# TypeScriptCompileBlocked
如果您使用不同的构建工具来构建您的项目(例如 gulp、grunt 等)和 VS 以获得开发和调试体验,请在您的项目中设置 <TypeScriptCompileBlocked>true</TypeScriptCompileBlocked>
。这应该为您提供所有的编辑支持,但在您按下 F5 时不会为您提供构建支持。
# TypeScriptEnableIncrementalMSBuild(TypeScript 4.2 Beta 及更高版本)
默认情况下,MSBuild 将尝试仅在自上次编译后更新项目的源文件时才运行 TypeScript 编译器。但是,如果此行为导致问题,例如启用 TypeScript 的 incremental
选项,请设置 <TypeScriptEnableIncrementalMSBuild>false</TypeScriptEnableIncrementalMSBuild>
以确保每次运行 MSBuild 都会调用 TypeScript 编译器。