如何在Deno TypeScript中为绝对路径和相对路径设置类型?
在Deno TypeScript中区分绝对路径与相对路径的类型方案
不需要靠变量名加absolute/relative前缀来区分,你可以通过TypeScript的类型系统结合Deno std库的工具函数,实现强类型的绝对/相对路径区分,同时兼容Windows和POSIX系统。以下是几种实用方案:
1. 品牌化类型(Branded Types)+ 类型守卫
通过给字符串添加"品牌"标记,结合类型守卫函数来确保路径类型的正确性,这是最通用的方案:
import { isAbsolute } from "std/path/mod.ts"; // 定义带品牌的路径类型 type AbsolutePath = string & { __brand: "absolute" }; type RelativePath = string & { __brand: "relative" }; // 类型断言函数:确保路径是绝对路径 function assertAbsolutePath(path: string): asserts path is AbsolutePath { if (!isAbsolute(path)) { throw new Error(`无效绝对路径: ${path}`); } } // 类型断言函数:确保路径是相对路径 function assertRelativePath(path: string): asserts path is RelativePath { if (isAbsolute(path)) { throw new Error(`无效相对路径: ${path}`); } } // 使用示例 // 直接声明类型 const configPath: AbsolutePath = "C:\\deno\\config.json"; // 动态转换并断言类型 const userInputPath = "./src/main.ts"; assertRelativePath(userInputPath); // 此时userInputPath的类型自动变为RelativePath // 函数参数强约束 async function loadConfig(path: AbsolutePath) { return await Deno.readTextFile(path); }
isAbsolute函数已经内置了跨平台判断逻辑,能自动识别Windows的盘符路径、UNC路径,以及POSIX的斜杠开头路径,所以这个方案天然兼容双平台。
2. 扩展ParsedPath为更具体的类型
针对std库的ParsedPath,可以根据路径特征扩展出绝对/相对版本的类型:
import type { ParsedPath } from "std/path/mod.ts"; import { parse, isWindows } from "std/path/mod.ts"; // Windows平台的绝对路径ParsedPath type WindowsAbsoluteParsedPath = ParsedPath & { // 要么是盘符根路径,要么是UNC路径根 root: `${string}:\\` | `\\\\${string}\\${string}\\`; }; // Windows平台的相对路径ParsedPath type WindowsRelativeParsedPath = ParsedPath & { root: ""; }; // POSIX平台的绝对/相对路径ParsedPath type PosixAbsoluteParsedPath = ParsedPath & { root: "/" | `/${string}/`; }; type PosixRelativeParsedPath = ParsedPath & { root: ""; }; // 类型守卫函数:判断是否为Windows绝对路径解析结果 function isWindowsAbsParsed(path: ParsedPath): path is WindowsAbsoluteParsedPath { return isWindows && !!path.root && (path.root.includes(":\\") || path.root.startsWith("\\\\")); } // 使用示例 const parsed = parse("\\\\server\\share\\file.txt"); if (isWindowsAbsParsed(parsed)) { // 此时parsed的类型是WindowsAbsoluteParsedPath console.log("这是Windows UNC绝对路径"); }
这种方案适合需要操作路径解析后字段的场景,能让类型系统更精准地约束解析结果的结构。
3. 模板字面量类型强约束路径格式
如果只需要针对Windows平台,可以直接用模板字面量定义路径的格式规则:
// Windows盘符绝对路径:比如C:\xxx\yyy type WindowsDriveAbsolutePath = `${string}:\\${string}`; // Windows UNC绝对路径:比如\\server\share\file type WindowsUNCAbsolutePath = `\\\\${string}\\${string}\\${string}`; // 合并所有Windows绝对路径类型 type WindowsAbsolutePath = WindowsDriveAbsolutePath | WindowsUNCAbsolutePath; // Windows相对路径:支持./、../或直接文件名 type WindowsRelativePath = `.\\${string}` | `..\\${string}` | `${string}`; // 使用示例 const validDrivePath: WindowsAbsolutePath = "D:\\Projects\\deno-demo"; const validUNCPath: WindowsAbsolutePath = "\\\\fileserver\\docs\\readme.md"; const validRelPath: WindowsRelativePath = "../utils/helper.ts";
这种方案能在编译阶段就拦截格式错误的路径,适合对路径格式有严格要求的场景。
内容的提问来源于stack exchange,提问作者Ooker
相关产品推荐
相关产品推荐

