TypeScript字面量类型推断:字符串与数字的行为差异问题
这是TypeScript对类型断言的兼容性判定规则导致的:
TS只允许两个存在类型重叠(即其中一个类型是另一个的子类型)的类型互相断言,两个完全无交集的类型之间的断言会被判定为错误,两种测试场景的差异就来自这条规则。
不同字符串字面量之间断言不报错的原因
你初始化普通对象时,TS默认对象属性可修改,所以不会把字符串属性推断为窄的字面量类型,而是推断为更宽的string类型:
比如const req1 = { method: "ABCD" }里,req1.method的类型是string,不是字面量"ABCD"。
而所有字符串字面量(比如"GET"、"POST")都是string的子类型,二者存在明确的类型重叠。你用as "GET"做断言,相当于主动告诉编译器“我确定这个string类型的属性实际值就是"GET"”,TS会信任你的手动判断,不会报错。
如果想要TS校验字符串字面量断言的合理性,可以用as const把对象属性锁定为字面量类型:
const req = { method: "GET" } as const // 此时req.method的类型被固定为字面量"GET" req.method as "POST" // 会直接报错:Conversion of type '"GET"' to type '"POST"' may be a mistake because neither type sufficiently overlaps with the other.
数字转字符串字面量报错的原因
req2.method的类型是number,number和字符串类型(包括所有字符串字面量)是完全独立的原始类型,二者没有任何重叠关系,也不存在子类型继承,所以TS会判定这种断言完全不合理,直接抛出错误。
如果确实需要强制跨无重叠类型断言,可以用as unknown as 目标类型的双重断言写法,但这会完全绕过TS的类型校验,非必要不建议使用。
内容的提问来源于stack exchange,提问作者user96551
相关产品推荐
相关产品推荐

