You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TypeScript中如何让结构相同的不同标称类型赋值编译失败?

解决TypeScript空接口赋值兼容问题的几种方法

TypeScript采用结构类型系统,空接口因结构完全一致会被判定为兼容。以下几种方法可让a = b编译失败,适用于TypeScript 4.7.4版本:

  • 使用品牌类型(Branded Types)
    给接口添加唯一的Symbol属性,让TypeScript识别为不同结构:

    const brandA = Symbol('A');
    const brandB = Symbol('B');
    
    interface A {
      [brandA]: never;
    }
    
    interface B {
      [brandB]: never;
    }
    
    let a: A;
    let b: B;
    
    a = b; // 编译失败:类型"B"缺少类型"A"要求的[brandA]属性
    

    原理:Symbol作为属性键具有唯一性,never类型确保外部无法赋值该属性,同时让两个接口结构存在差异,触发类型不兼容错误。

  • 使用Class代替接口
    TypeScript对Class采用名义类型检查,即使结构相同,不同Class的实例类型也不兼容:

    class A {}
    class B {}
    
    let a: A;
    let b: B;
    
    a = b; // 编译失败:无法将类型"B"分配给类型"A"
    

    这种方法最简单直接,适合不需要接口特性的场景。

  • 添加唯一字面量属性
    给每个接口添加一个值不同的字面量类型属性,强制结构不兼容:

    interface A {
      __type: 'A';
    }
    
    interface B {
      __type: 'B';
    }
    
    let a: A;
    let b: B;
    
    a = b; // 编译失败:类型""B""无法分配给类型""A""
    

    原理:字面量类型是严格匹配的,__type的取值不同导致两个接口结构不兼容。

内容的提问来源于stack exchange,提问作者Cheetah

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 06:24:46