我将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,以上条件均不满足。