为何受约束的泛型结合条件类型未按预期工作?
TypeScript泛型条件类型匹配错误原理解析
先看报错的代码片段:
function importedF<R extends string>(a: R extends string ? number : never) {} function genericF<T extends string>() { importedF<T>(1); }
对应的错误信息:
Argument of type 'number' is not assignable to parameter of type 'T extends string ? number : never'.ts(2345)
核心原因:未具体化泛型参数的条件类型不会被化简
TypeScript的类型检查逻辑里,当泛型参数是尚未被具体类型替换的类型变量时,条件类型会保持原始形式,不会提前求值。
虽然T被约束为extends string,但在genericF的定义阶段,T只是一个泛型变量——它不是具体的字符串类型(比如string或"hello"),而是一个占位符。此时TypeScript不会主动推导T extends string必然成立,也不会把条件类型T extends string ? number : never化简成number。
你传入的1是具体的number类型,但类型检查器只能看到它要匹配的是一个未化简的条件类型表达式,而不是确定的number类型,因此会抛出类型不匹配的错误。
内容的提问来源于stack exchange,提问作者Rubinous
相关产品推荐
相关产品推荐

