本次打卡值得关注的内容有,算法题为 merge sorted array,Review 主要内容为 TypeScript 类型声明的高阶用法,本周 Tips 内容为组件库功能探索与实践,主要是贴几个链接 mark 一下,分享的内容为 Angular 中的单元测试
Algorithm
本周继续完成 easy part,名为 merge sorted array,合并两个有序数组。
这个题目尝试了蛮多次,感觉 nums1 数组使用 0 占位,从 JS 的角度反而增加了复杂度,最后给出的代码如下
var merge = function(nums1, m, nums2, n) {debugger;
var t = 0; // 偏移
for(var i = 0; i < n; i++) {
var n2 = nums2[i];
if(!m) {
nums1.splice(0, 1, n2);
m++;
continue;
}
for(var j = t; j < m; j++) {
var n1 = nums1[j];
var nextIndex = j + 1;
var next = nums1[nextIndex];
var insertIndex = -1;
if(n2 <= n1) {
insertIndex = j;
}
if(n2 > n1 && ( nextIndex >= m || n2 <= next)) {
insertIndex = j + 1;
}
if(insertIndex !== -1) {
nums1.splice(insertIndex, 0, n2);
m++;
t = insertIndex;
break;
}
}
}
nums1.length = m
};
Review
本周阅读的文章来自 JavaScript Weekly 推荐,Using Typescript to make invalid states irrepresentable,标题花里胡哨的,主要内容就是 TypeScript 类型声明的一点高级用法。
如果我们需要声明一个类型,有两个可选字段 field1 和 field2,可以都无,可以均有,可以有 field1 无 field2,但不能只有 field2。我们需要怎么做呢。大致如下
interface NoFields {};
interface Field1Only {
field1: string;
};
interface BothField1AndField2 {
field1: string;
field2: string;
};
/* 其实并不会用到这个,这里起到一个 doc 的作用 */
interface InvalidObject {
field2: string;
};
然后我们利用 type
关键字就可以声明一个特定类型了
type Fields = NoFields | Field1Only | BothField1AndField2;
看上去是不是很美好了,但这里存在一个小问题,NoFields
类型是可以任意扩展的。如果我们要禁止非预期的字段,就需要用到 never
关键字了,配合动态声明的语法。
type NoFields = {
[key: string]: never;
};
那么如果我们要允许非预期的字段呢,可以用到 [key: string]: type
即可。
Tip
组件库工程探索与实践
Share
最近公司进行了一次 Test Day,主要目的是为项目添加测试用例,于是对 angular 中单元测试和组件测试进行了简单学习。
相关概念
- spy 间谍
- TestBed 测试机床
两种风格
- 使用 beforeEach 和 TestBed
- 显示创建类
官网的文档,大而全,对于初学者,我们往往只需要掌握 20% 即可,这里先列出找到的不错的 Angular 测试相关资料