下面是一个用 TypeScript 编写的函数,用于替换文件名的后缀名。该函数接受两个参数:原始文件名和目标后缀名,并返回替换后的新文件名。
函数实现
/**
* 替换文件名的后缀名
* @param fileName - 原始文件名(例如 "3098237900953751561.dwg")
* @param newExtension - 新的后缀名(例如 "mxweb")
* @returns 替换后的新文件名(例如 "3098237900953751561.mxweb")
*/
function replaceFileExtension(fileName: string, newExtension: string): string {
// 检查输入是否有效
if (!fileName || typeof fileName !== 'string') {
throw new Error("Invalid fileName: must be a non-empty string");
}
if (!newExtension || typeof newExtension !== 'string') {
throw new Error("Invalid newExtension: must be a non-empty string");
}
// 使用正则表达式匹配文件名的最后一部分(即后缀名)
const lastDotIndex = fileName.lastIndexOf('.');
if (lastDotIndex === -1) {
// 如果没有找到后缀名,直接在文件名后添加新的后缀
return `${fileName}.${newExtension}`;
}
// 替换后缀名为新的后缀名
const baseName = fileName.slice(0, lastDotIndex); // 获取文件名的基础部分
return `${baseName}.${newExtension}`; // 拼接新的后缀名
}
// 示例用法
const originalFileName = "3098237900953751561.dwg";
const newExtension = "mxweb";
const newFileName = replaceFileExtension(originalFileName, newExtension);
console.log(newFileName); // 输出: "3098237900953751561.mxweb"
代码解析
输入校验:
- 确保 fileName 是一个非空字符串。
- 确保 newExtension 是一个非空字符串。
- 如果输入无效,抛出错误以提醒调用者。
- 处理无后缀名的情况:
- 如果文件名中没有 .,说明没有后缀名。此时直接将新后缀名追加到文件名后面。
替换逻辑:
- 使用 lastIndexOf('.') 找到最后一个 . 的位置。
- 使用 slice 方法提取文件名的基础部分(即去掉原后缀的部分)。
- 拼接新的后缀名,生成最终结果。
示例输出:
输入 "3098237900953751561.dwg" 和 "mxweb",输出 "3098237900953751561.mxweb"。
边界情况测试
以下是一些边界情况及其预期结果:
// 测试无后缀名的文件
console.log(replaceFileExtension("file", "txt")); // 输出: "file.txt"
// 测试多个点的文件名
console.log(replaceFileExtension("archive.tar.gz", "zip")); // 输出: "archive.tar.zip"
// 测试只有后缀名的文件
console.log(replaceFileExtension(".gitignore", "txt")); // 输出: ".gitignore.txt"
// 测试空后缀名
console.log(replaceFileExtension("document.", "pdf")); // 输出: "document.pdf"
总结
该函数设计简单、健壮,能够处理各种常见的文件名替换场景。如果你有其他需求(例如支持多后缀名的复杂替换),可以进一步扩展逻辑。