
如下面的代码所示,我声明了一个名为 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 Jun 18, 2022 这是预期的结果,TypeScript 的类型系统有些类似于 golang 的 interface:只要满足了要求的约束即可,不检查其余部分。 |
2 lod Jun 18, 2022 |
3 learningman Jun 18, 2022 只管少不管多的 |
4 irisdev Jun 18, 2022 ts 本来就是这样,对象字面量赋值和函数不允许多余属性是因为默认有多余属性检查 |
5 cyndra0 Jun 18, 2022 如果你用对象字面量指定 abc 的值的话,结果就是符合你的预期的 |
7 luob Jun 18, 2022 1. 这跟嵌套没关系,你写了一大堆,其实放顶层一样是这么检查的 2. 这明显是个伪需求 如果你需要所有字段或者某几项可选,那加两个问号就行了 如果你只需要子集,那多余的字段根本不用管 如果你需要在运行时根据字段进入分支,那 typescript 压根管不着这事…… 所以你到底想干啥,除了出类型体操给人玩以外想不到什么实际意义 |