TypeScript联合类型类型推断疑问:为何参数类型为any而非对应类型?
问题原因与解决方案
为什么val的类型是any?
你定义的TestType是两个独立对象类型的联合,TypeScript无法自动关联value的类型和run方法参数的类型。当你给obj赋值时,TS只会检查整体是否符合联合类型的某一分支,但在推断run的参数类型时,因为没有明确的绑定关系,就会默认推断为any。
解决方法一:用泛型绑定类型关联
通过泛型将value的类型和run的参数类型绑定,让TS能根据value的类型自动推断出run参数的类型:
// 定义泛型类型,T 对应 value 的类型 type TestType<T extends string | string[]> = { value: T; run: (v: T) => void; }; // 赋值时无需手动指定泛型,TS会自动根据value推断T的类型 const obj1: TestType<string> = { value: '12', run: (val) => { // val 类型自动推断为 string console.log(val.length); } }; const obj2: TestType<string[]> = { value: ['a', 'b'], run: (val) => { // val 类型自动推断为 string[] console.log(val.map(item => item.toUpperCase())); } }; // 更灵活的写法:让TS自动推导泛型,无需显式声明 const obj3 = { value: 'hello', run: (val: typeof obj3.value) => { // val 类型为 string } };
解决方法二:使用区分联合类型
如果必须保留联合类型的结构,可以给每个分支添加字面量类型的区分字段,让TS通过该字段明确当前分支,从而关联value和run的类型:
type TestType = | { type: 'single'; // 区分字段 value: string; run: (v: string) => void; } | { type: 'array'; // 区分字段 value: string[]; run: (v: string[]) => void; }; // 赋值时指定type字段,TS就能自动推断run的参数类型 const obj: TestType = { type: 'single', value: '12', run: (val) => { // val 类型自动推断为 string } };
内容的提问来源于stack exchange,提问作者XiaoShang
相关产品推荐
相关产品推荐

