
如下面的代码所示,我声明了一个名为 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 这是预期的结果,TypeScript 的类型系统有些类似于 golang 的 interface:只要满足了要求的约束即可,不检查其余部分。 |
2 lod 2022-06-18 16:31:32 +08:00 |
3 learningman 2022-06-18 16:32:33 +08:00 只管少不管多的 |
4 irisdev 2022-06-18 16:36:55 +08:00 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 压根管不着这事…… 所以你到底想干啥,除了出类型体操给人玩以外想不到什么实际意义 |