TypeScript 暴露规范文件名逻辑

t2a7ltrp  于 6个月前  发布在  TypeScript
关注(0)|答案(3)|浏览(64)

搜索词

规范文件名

建议

我想重用 get-canonical-filename 逻辑:
TypeScript/src/compiler/core.ts
第1906行到第1909行
| | exporttypeGetCanonicalFileName=(fileName: string)=>string; |
| | exportfunctioncreateGetCanonicalFileName(useCaseSensitiveFileNames: boolean): GetCanonicalFileName{ |
| | returnuseCaseSensitiveFileNames ? identity : toFileNameLowerCase; |
| | } |

用例

我想使用 ts.resolveModuleName 和其伴随的 ts.createModuleResolutionCache 来解析 ImportDeclaration (如评论建议)。
createModuleResolutionCache 需要一个参数 getCanonicalFileName。我认为在这里使用与编译器本身相同的逻辑是最合适的,这就是我上面链接的函数。
可以 直接复制粘贴这个函数,但那 感觉 不对,并且如果将来更新了 toFileNameLowerCase(它也没有暴露),可能会导致未来出现差异。

示例

const cache = ts.createModuleResolutionCache(currentDirectory, ts.createGetCanonicalFileName(true/false));
const resolved = ts.resolveModuleName(name, file, compilerOptions, host, cache);

检查清单

我的建议满足以下准则:

  • 这不会对现有的 TypeScript/JavaScript 代码造成破坏性更改
  • 这不会改变现有 JavaScript 代码的运行时行为
  • 这可以在不根据表达式的类型发出不同的 JS 的情况下实现
  • 这不是一个运行时特性(例如库功能、带有 JavaScript 输出的非 ECMAScript 语法等)
  • 这个特性将与 TypeScript's Design Goals 的其他部分保持一致。
jvlzgdj9

jvlzgdj91#

我们需要让 createModuleResolutionCache 也接受 caseSensitive,而不是暴露 createGetCanonicalFileName

hwazgwia

hwazgwia2#

是的,这可能更有意义。我假设我能使用compilerHost.useCaseSensitiveFileNames来获取适当的值?

zqry0prt

zqry0prt3#

我刚刚注意到 CompilerHost 提供了访问 getCanonicalFileName 方法的途径:
TypeScript/lib/typescript.d.ts
第2926行到第2934行
| | exportinterfaceCompilerHostextends ModuleResolutionHost{ |
| | getSourceFile(fileName: string,languageVersion: ScriptTarget,onError?: (message: string)=>void,shouldCreateNewSourceFile?: boolean): SourceFile|undefined; |
| | getSourceFileByPath?(fileName: string,path: Path,languageVersion: ScriptTarget,onError?: (message: string)=>void,shouldCreateNewSourceFile?: boolean): SourceFile|undefined; |
| | getCancellationToken?(): CancellationToken; |
| | getDefaultLibFileName(options: CompilerOptions): string; |
| | getDefaultLibLocation?(): string; |
| | writeFile: WriteFileCallback; |
| | getCurrentDirectory(): string; |
| | getCanonicalFileName(fileName: string): string; |
针对我的特定用例的解决方法可以是:

const host = ts.createCompilerHost(compilerOptions); //ugly, but necessary when using the transformer API (#37754)
const cache = ts.createModuleResolutionCache(currentDirectory, host.getCanonicalFileName, compilerOptions);

相关问题