你可以在 JavaScript 中使用的 3 个 TypeScript 技巧

2025-06-09

你可以在 JavaScript 中使用的 3 个 TypeScript 技巧

替代文本

TypeScript 的流行度正在迅速增长,但对于某些项目来说,它并不值得投入精力。不过,即使你正在编写 JavaScript,也可以从 TypeScript 中学习一些模式。以下是我们最喜欢的 3 个受 TypeScript 启发的 JavaScript 模式。

1)JavaScript 枚举

TypeScript 支持枚举,枚举是一种用于定义对象的简洁模式,您可以使用该对象的键来代替硬编码的字符串。

enum Direction {
  Up,
  Down,
  Left,
  Right
}
Enter fullscreen mode Exit fullscreen mode

JavaScript 不支持枚举。但是 TypeScript 可以编译为 JavaScript,那么上面的代码会变成什么呢?事实证明,TypeScript 枚举会编译为JavaScript POJO

const Direction = {
  Up: 'Up',
  Down: 'Down',
  Left: 'Left',
  Right: 'Right'
};
Enter fullscreen mode Exit fullscreen mode

你也可以Direction使用 来使枚举不可变Object.freeze(),这Direction与 TypeScript 枚举非常接近。这意味着你可以像在其他语言中那样使用枚举:

  • 获取允许的枚举值:Object.keys(Direction)
  • 检查一个值是否等于枚举值:val === Direction.Up
  • 检查枚举中是否存在某个值:Object.hasOwnProperty(val)

2)orFail()避免空检查的辅助方法

TypeScript 要求你在 Mongoose 中检查null查询结果。这是一个很好的做法,但如果你需要反复执行,也会变得有点麻烦。

const doc = await Model.findOne();
// TypeScript reports an error "Object is possibly 'null'."
// Need to add a `if (doc != null)` check
doc._id;
Enter fullscreen mode Exit fullscreen mode

Mongoose 查询有一个简洁的orFail()辅助方法,如果没有结果,它会抛出一个错误,这意味着你可以直接使用,doc 而不需要显式检查null。这是因为orFail()会将查询标记为解析为NonNullable

const doc = await Model.findOne().orFail();
// Works!
doc._id;
Enter fullscreen mode Exit fullscreen mode

我们在 TypeScript 测试中经常使用这种orFail()模式,因为它可以避免我们添加重复的if检查。如果orFail()触发了错误,错误就会冒泡到错误处理程序中。

但是,没有理由不能orFail()在 JavaScript 中使用!仅仅因为 TypeScript 没有告诉你存在问题,并不意味着问题不存在。

类似地,如果你有其他函数,它们null在未找到值时可能会返回,可以考虑将它们包装在一个函数中,该函数在未找到值时会抛出错误。这样可以省去很多null检查!

3)对未知类型的对象使用JavaScript 映射

与定义具有任意键的对象相比,TypeScript 使得定义具有任意键的映射变得稍微容易一些。

// An object with string keys and values of type `T`
interface AnyObject<T = any> { [k: string]: T }

// Map with string keys and values of type `T`
type AnyMap<T = any> = Map<string, T>;
Enter fullscreen mode Exit fullscreen mode

TypeScript 使得使用映射来存储任意键/值映射变得更加容易,并且有充分的理由:映射支持从任意类型的键进行映射。

const fakeMap = {};
fakeMap[1] = 'number';
fakeMap['1'] = 'string';
fakeMap; // { '1': string }

const map = new Map();
map.set(1, 'number');
map.set('1', 'string');
map; // Map(2) { 1 => 'number', '1' => 'string' }
Enter fullscreen mode Exit fullscreen mode

问题在于,JavaScript 对象的键只能是字符串或符号,所以 JavaScript 总是会将对象键转换为字符串。因此,当你不确定所使用的键是否是字符串时,应该使用 Map。

鏂囩珷鏉ユ簮锛�https://dev.to/masteringjs/3-typescript-tricks-you-can-use-in-javascript-1m75
PREV
Dev.to 的 ReactJS 克隆:使用 React Hooks
NEXT
🔐 2025 年三大最佳身份验证框架 🗝️🧰