【发布时间】:2020-01-09 09:46:07
【问题描述】:
我正在使用 TypeScript 和这样的正则表达式解析文件名:
import { Filename } from '../models/filename';
const FILENAME_REGEX = /^(?<slug>.*?)(\.(?<language>[a-z]{2}))?(\.|\-(?<region>[A-Z]{2})\.)(?<extension>[a-z]*)$/i;
export const parseFilename = (filename: string): Filename => {
const result = FILENAME_REGEX.exec(filename);
if (result?.groups && result.groups['slug'] && result.groups['extension']) {
return {
slug: result.groups['slug'],
language: result.groups['language'],
region: result.groups['region'],
extension: result.groups['extension']
};
}
throw new Error("Filename doesn't match pattern");
};
文件名模型如下:
export interface Filename {
slug: string;
language?: string;
region?: string;
extension: string;
}
我的问题是,如果文件名 page.en.md 的 region 组未定义,我将返回一个对象,如 ...
{
slug: "page",
language: "en",
region: undefined,
extension: "md"
}
.. 有没有一种干净的方法,不需要太多 if 和 else 来获得像这样的对象?:
{
slug: "page",
language: "en",
extension: "md"
}
有一个未定义的键和一个未定义的键的基本原理或用例是什么?
【问题讨论】:
-
这是一个有趣的问题。我总是通过确保我的代码在未定义时根本不添加键来避免这种情况,但是 javascript 本身有一种方法可以让属性存在但具有未定义的值与根本没有值。不知道你是否可以用 TS 来表达这一点,但我一直在关注答案 =)
-
缺少键的对象与键具有
undefined值的对象之间存在明显差异(例如,prop in obj将是false用于前者,true用于后者),但TypeScript doesn't represent it very well。为了获得最佳结果:不要编写依赖于这种差异的代码
标签: typescript