V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
yodhcn
V2EX  ›  程序员

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

  •  
  •   yodhcn ·
    yodhcn · 2022-06-18 15:25:48 +08:00 · 1642 次点击
    这是一个创建于 900 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    所以你到底想干啥,除了出类型体操给人玩以外想不到什么实际意义
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1009 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 21:46 · PVG 05:46 · LAX 13:46 · JFK 16:46
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.