typescript 将属性从数组提取到联合类型中

3lxsmp7m  于 2023-04-22  发布在  TypeScript
关注(0)|答案(1)|浏览(112)

我有一个对象数组:

export const myArr = [
  { id: 'type 1', ... },
  { id: 'type 2', ... },
  { id: 'type 3', ... },
  ...
] as const;

我想将id属性提取到一个联合类型中。所需的结果是:

export type MyTypes = 'type 1' | 'type 2' | 'type 3' | ...;

我试过了

export type MyTypes = Extract<(typeof myArr)[number], 'id'>;

但是编译器坚持将其生成为type MyTypes = never。我做错了什么?

1rhkuytd

1rhkuytd1#

  • jonrsharpe是第一个在我完成我的回答之前发表评论的,但让我仍然张贴它来解释更详细的内容)*

首先,Extract实用程序类型是用来做一些不同的事情的-当你有AB类型时:

type A = 'a' | 'b' | 'c';
type B = 'b' | 'c' | 'd';

则由Extract<A, B>返回的类型提取可以被分配给类型B的联合类型A的所有成员。
另一个可能更有用的例子-对于类型:
type C = 'a' | 'b' | 1 | 10;
Extract<C, string>类型为'a' | 'b'
有关详细信息,请参阅文档:

  • https://www.typescriptlang.org/docs/handbook/utility-types.html#extracttype-union

例如,参见:

现在,为了得到你想要的,你需要用途:

type Id = (typeof myArr)[number]['id'];
``

Or, using the `Pick` suggested in the comment you'd have to use:

```ts
type Id = Pick<(typeof myArr)[number], 'id'>['id'];

请注意,它比你的问题的注解中的示例更复杂,因为Pick<(typeof myArr)[number], 'id'>会给予你类型:

type Id = {
    readonly id: "type 1" | "type 2" | "type 3";
}

这是一个键为id的对象类型,其类型为"type 1" | "type 2" | "type 3",而不仅仅是您需要的类型"type 1" | "type 2" | "type 3"
看看它在VSCode中的样子:

相关问题