如下面的代码所示,我声明了一个名为 Test 类型,其中一个 key 为 abc 的 value 类型为 ABC 。
[问题]
Typescript 只会检查 Test.abc 里面的 key 类型是否正确,以及是否缺少 key ,但不会检查是否有多余的 key 。
为啥会出现这种情况?以及如何解决嵌套类型验证的问题?
// 声明一个名为 ABC 的类型
export type ABC = {
a: string;
b: number;
c: string;
};
// 声明一个名为 Test 类型,其中一个 key 为 abc 的 value 类型为 ABC
export type Test = {
a: string;
b: number;
c: string;
abc: ABC;
};
// 对象 abc
const abc: ABC = {
a: 'aaa',
b: 111,
c: 'ccc',
};
// 对象 abcd
const abcd = {
a: 'aaa',
b: 111,
c: 'ccc',
d: 'ddd',
};
// 对象 ab
const ab = {
a: 'aaa',
b: 111,
};
// 对象 abc 通过类型检查
const test_1: Test = {
a: 'aaa',
b: 111,
c: 'ccc',
abc: abc,
};
console.log(test_1);
// 对象 abcd 通过类型检查
const test_2: Test = {
a: 'aaa',
b: 111,
c: 'ccc',
abc: abcd,
};
console.log(test_2);
// 对象 ab 没有通过类型检查
const test_3: Test = {
a: 'aaa',
b: 111,
c: 'ccc',
abc: ab,
};
console.log(test_3);
1
liuhan907 2022-06-18 15:32:13 +08:00 1
这是预期的结果,TypeScript 的类型系统有些类似于 golang 的 interface:只要满足了要求的约束即可,不检查其余部分。
|
2
nziu 2022-06-18 16:31:32 +08:00 1
|
3
learningman 2022-06-18 16:32:33 +08:00
只管少不管多的
|
4
irisdev 2022-06-18 16:36:55 +08:00 1
ts 本来就是这样,对象字面量赋值和函数不允许多余属性是因为默认有多余属性检查
|
5
cyndra0 2022-06-18 17:56:10 +08:00
如果你用对象字面量指定 abc 的值的话,结果就是符合你的预期的
|
7
luob 2022-06-18 19:14:10 +08:00
1. 这跟嵌套没关系,你写了一大堆,其实放顶层一样是这么检查的
2. 这明显是个伪需求 如果你需要所有字段或者某几项可选,那加两个问号就行了 如果你只需要子集,那多余的字段根本不用管 如果你需要在运行时根据字段进入分支,那 typescript 压根管不着这事…… 所以你到底想干啥,除了出类型体操给人玩以外想不到什么实际意义 |