我将type assertion视为类似于Hi Compiler, I know the type of this variable better than you. Just follow me!

但是似乎编译器仍然具有自己的逻辑来推断类型。例如,假设

interface PM_MGEInfo {
    category: string;
    bid: string;
    cid?: string;
    labs?: { [key: string]: any };
}

然后,1&2没问题,但是3抛出TS2352错误。
  • function makeMgeInfo(bid: string): PM_MGEInfo {
        return <PM_MGEInfo>{
            bid
        };
    }
    
  • function makeMgeInfo(bid: string): PM_MGEInfo {
        return <PM_MGEInfo>{
            bid,
            labs: {}
        };
    }
    
  • function makeMgeInfo(bid: string): PM_MGEInfo {
        return <PM_MGEInfo>{
            bid,
            // error TS2352: Type '{ labs: { poi_id: string; }; bid: string; }' cannot be converted to type 'PM_MGEInfo'.
            // Property 'category' is missing in type '{ labs: { poi_id: string; }; bid: string; }'.
            labs: {a: 1}
        };
    }
    

  • 为什么type assertion开始检查3中的其他字段?有人知道它的详细逻辑吗?

    更新:我在Github Microsoft/TypeScript#23698中创建了一个问题。

    最佳答案

    检查规范4.16 Type Assertions,它受this answer启发:



    对于情况1,很明显T可分配给e

    对于情况2,e的扩展形式是{bid: string, labs: Object},可以将T分配给。请注意,labs?可分配给Object(实际上,我不确定,但这是我唯一可能的解释)。

    对于情况3,以上条件均不满足。

    10-06 02:58