TypeScript使用Pick提取Todo类型数组元素类型报错如何解决
错误原因
你编写的代码中Pick<Todo, "items">返回的是仅包含items属性的对象类型,结构为{ items: Array<{name:string, value:string}> },并不是直接的数组类型,因此无法通过[0]索引到数组元素类型。
可行解决方案
- 方案1:直接索引属性+数组元素提取(最简洁)
直接通过索引访问拿到items的数组类型,再通过[number]提取数组元素类型,这是TS的标准数组元素提取写法:
type TodoItem = Todo["items"][number];
[number]会匹配数组所有数字索引对应的元素,最终直接返回数组的元素类型。
- 方案2:泛型推断实现(兼容性更强)
如果不确定items的类型是否一定是数组,可以用类型推断的写法,避免后续第三方模块的Todo类型变动时产生意料之外的报错:
type TodoItem = Todo["items"] extends Array<infer ElementType> ? ElementType : never;
如果items是数组类型,会自动推断出数组元素类型赋值给TodoItem,否则返回never类型。
验证效果
完整可运行无报错的代码示例如下:
type Todo = { title: string; items:Array<{name:string,value:string}>; description: string; completed: boolean; } // 采用方案1实现 type TodoItem = Todo["items"][number]; const todo: TodoItem = { name: "Clean room", value: "yes", };
内容的提问来源于stack exchange,提问作者GorvGoyl
相关产品推荐
相关产品推荐

