你可以在 JavaScript 中使用的 3 个 TypeScript 技巧
TypeScript 的流行度正在迅速增长,但对于某些项目来说,它并不值得投入精力。不过,即使你正在编写 JavaScript,也可以从 TypeScript 中学习一些模式。以下是我们最喜欢的 3 个受 TypeScript 启发的 JavaScript 模式。
1)JavaScript 枚举
TypeScript 支持枚举,枚举是一种用于定义对象的简洁模式,您可以使用该对象的键来代替硬编码的字符串。
enum Direction {
Up,
Down,
Left,
Right
}
JavaScript 不支持枚举。但是 TypeScript 可以编译为 JavaScript,那么上面的代码会变成什么呢?事实证明,TypeScript 枚举会编译为JavaScript POJO。
const Direction = {
Up: 'Up',
Down: 'Down',
Left: 'Left',
Right: 'Right'
};
你也可以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;
Mongoose 查询有一个简洁的orFail()
辅助方法,如果没有结果,它会抛出一个错误,这意味着你可以直接使用,doc
而不需要显式检查null
。这是因为orFail()
会将查询标记为解析为NonNullable。
const doc = await Model.findOne().orFail();
// Works!
doc._id;
我们在 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>;
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' }
问题在于,JavaScript 对象的键只能是字符串或符号,所以 JavaScript 总是会将对象键转换为字符串。因此,当你不确定所使用的键是否是字符串时,应该使用 Map。
鏂囩珷鏉ユ簮锛�https://dev.to/masteringjs/3-typescript-tricks-you-can-use-in-javascript-1m75