在 Typescript 中解构赋值和“Pick”时,类型上不存在属性

COL*_*EAN 1 javascript typescript

我想使用模型中定义的接口作为函数的参数。

// model/interface.ts
import { Document } from 'mongoose';

export interface Post extends Document {
  location: {
    type: string;
    coordinates: number[];
  };
};

// service/post_create.ts
import { Post } from '../../model/interface/post';

const exec = async (location: Pick<Post, 'location'>) => {
  const { coordinates: [x, y] } = location;
  // -> Property 'coordinates' does not exists on type 'Pick<Post, 'location'>'
}
Run Code Online (Sandbox Code Playgroud)

我已经通过 Pick 指定了一个类型,我已导入该类型以使用接口作为函数参数,但我实际上无法在函数内找到名为“坐标”的属性。

我犯了什么错误?

Mac*_*ora 7

Pick实用程序类型用于“过滤”对象类型的键,所以如果你说

type X = Pick<Post, 'location'>
/*
It means:
X = {
  location: {
    type: string;
    coordinates: number[];
  };
}
*/
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,我们的对象类型仅具有选定的属性,在您的示例中我们选择了一个 - location。但这意味着location是该对象中的一个属性,为了访问它,您需要说location.location


看看您的用例,我认为您想要获取location属性类型而不是过滤对象。获取属性类型可以通过索引类型来完成。考虑:

const exec = async (location: Post['location']) => {
  const { coordinates: [x, y] } = location; // works
}
Run Code Online (Sandbox Code Playgroud)

Post['location']采用location该类型的属性的类型Post