如何从TypeScript接口提取可分配指定类型值的键?
解决TypeScript提取可接受指定类型赋值的属性键问题
问题核心
你需要从接口中筛选出属性值可以接受类型U赋值的键,但之前的类型定义搞反了赋值兼容性的检查方向,导致返回空类型。
错误原因分析
你之前的AssignableProps类型逻辑是找出属性类型T[K]是U的子类型的键——也就是属性值可以赋值给U类型变量,但你需要的是反过来:U类型的值可以赋值给属性,这时候要检查U是否是T[K]的子类型(即U extends T[K])。
正确类型定义
将条件判断的方向反转即可:
type AssignableProps<T, U> = { [K in keyof T]: U extends T[K] ? K : never; }[keyof T];
验证测试
用示例接口Foo测试:
interface Foo { num: number; str: string; nullishNum: number | null | undefined; optionalStr?: string; } // 提取可接受number | null | undefined赋值的键,结果为"nullishNum" type TestAssignable = AssignableProps<Foo, number | null | undefined>; // 其他测试场景 // 提取可接受number赋值的键,结果为"num" | "nullishNum" type TestNumberAssignable = AssignableProps<Foo, number>; // 提取可接受undefined赋值的键,结果为"nullishNum" | "optionalStr" type TestUndefinedAssignable = AssignableProps<Foo, undefined>;
场景适配
这个类型可以直接用于简化数据获取与错误处理:比如后端返回的字段可能包含null/undefined,你可以用它快速筛选出前端接口中能直接接收这些值的属性,避免逐个编写类型判断逻辑,减少重复代码。
内容的提问来源于stack exchange,提问作者bleistift2
相关产品推荐
相关产品推荐

