[求助] typescript 的嵌套类型检查问题

2022-06-18 15:25:48 +08:00
 yodhcn

如下面的代码所示,我声明了一个名为 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);
1459 次点击
所在节点    程序员
7 条回复
liuhan907
2022-06-18 15:32:13 +08:00
这是预期的结果,TypeScript 的类型系统有些类似于 golang 的 interface:只要满足了要求的约束即可,不检查其余部分。
nziu
2022-06-18 16:31:32 +08:00
learningman
2022-06-18 16:32:33 +08:00
只管少不管多的
irisdev
2022-06-18 16:36:55 +08:00
ts 本来就是这样,对象字面量赋值和函数不允许多余属性是因为默认有多余属性检查
cyndra0
2022-06-18 17:56:10 +08:00
如果你用对象字面量指定 abc 的值的话,结果就是符合你的预期的
noe132
2022-06-18 18:08:34 +08:00
luob
2022-06-18 19:14:10 +08:00
1. 这跟嵌套没关系,你写了一大堆,其实放顶层一样是这么检查的
2. 这明显是个伪需求

如果你需要所有字段或者某几项可选,那加两个问号就行了
如果你只需要子集,那多余的字段根本不用管
如果你需要在运行时根据字段进入分支,那 typescript 压根管不着这事……

所以你到底想干啥,除了出类型体操给人玩以外想不到什么实际意义

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/860507

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX