从 TypeScript 中的 keyof 类派生的联合类型

TypeScript 有没有办法让联合类型成为仅在类中找到的键的联合?

例如,让 MyClass 如下:

class MyClass {
  propertyA: string;
  propertyB: number;
  propertyC: number[];

  someMethod() {
    // Do something
  }
}

有什么方法可以告诉 TypeScript 我只需要 MyClass 的属性的联合类型?所以,像

type MyType in keyof MyClass = "propertyA" | "propertyC";

这是无效的语法,但这是我正在寻找的效果。

如果我也试试

type MyType in keyof MyClass = "propertyA" | "propertyC" | "heyThere";

这将是一个错误,但以下内容

type MyType in keyof MyClass = "propertyA" | "propertyB" | "propertyC";

不会。

我在 TypeScript 中缺乏正式的词汇,所以我不确定什么可能对这里有帮助。

我在这里和网上都看过,但我发现的东西与我要找的东西不同。例如,我遇到过

type MyType = keyof MyClass;

但这给了我 MyClass 中的一切。

奖励:我们如何告诉 TypeScript 我们期望的类型必须是字符串的联合?

我还注意到,如果我使用 Pick 内置类型,TypeScript 会正确地强制我为该类选择键,而 Omit 内置类型不会。这就是我寻找这个警告的原因。

caoyangcui 回答:从 TypeScript 中的 keyof 类派生的联合类型

没有像您描述的那样起作用的内置语法,但是您可以像这样创建一个助手 type alias

type MustExtend<U,T extends U> = T;

然后代替

// type MyType in keyof MyClass = "propertyA" | "propertyC";

你可以写

type MyType = MustExtend<keyof MyClass,"propertyA" | "propertyB">; // okay
// type MyType = "propertyA" | "propertyB"

按需要工作。如果你犯了错误,它会警告你:

type MyType2 = 
  MustExtend<keyof MyClass,"propertyA" | "propertyC" | "heyThere">; // error!
// -----------------------> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Type '"heyThere"' is not assignable to type 'keyof MyClass'.

也可以根据需要。

Playground link to code

本文链接:https://www.f2er.com/3517.html

大家都在问