对自定义打字稿类型的反思

Yoa*_*gen 5 typescript

我在打字稿中定义了一个自定义类型

type MyType = 'left' | 'right';
Run Code Online (Sandbox Code Playgroud)

如何检查变量是否与该类型匹配?如何迭代该类型的可能值?(例如创建相应的选择元素)

jca*_*alz 6

在运行时添加类型信息是 TypeScript 明确的非目标。这意味着他们不想允许您定义类型然后在运行时检查它。

然而,反之亦然:创建一个运行时存在的对象,并使用 TypeScript 推断有关它的类型信息。这是针对您的情况的一种方法。

首先,添加以下辅助函数:

function stringLiteralArray<T extends string>(...args: T[]): T[] {
  return args;
}
Run Code Online (Sandbox Code Playgroud)

这有助于 TypeScript 推断字符串文字数组,而不仅仅是string[].

现在您可以创建一个名为 的运行时对象myType,并MyType从中派生:

const myType = stringLiteralArray('left', 'right'); // ('left'|'right')[]
type MyType = (typeof myType)[number]; // 'left' | 'right'
Run Code Online (Sandbox Code Playgroud)

然后你就有了运行时和编译时类型信息。您可以使用以下用户定义的类型保护检查变量是否属于该类型:

function isMyType(x: any): x is MyType {
  return myType.includes(x); // needs es2016 at least, or implement yourself
}
Run Code Online (Sandbox Code Playgroud)

您可以myType在运行时进行迭代,并且可以在编译时进行详尽检查MyType

function foo(x: MyType): string { // error, not exhaustive
  switch (x) {
    case 'left': return 'L';
    case 'rihgt': return 'R'; // error, 'rihgt' isn't 'left'|'right'
  }
}
Run Code Online (Sandbox Code Playgroud)

希望有帮助。


Pal*_*leo 1

这是不可能的。

你必须编写和使用这样的东西:

type MyType = 'left' | 'right';
const MyTypeMeta = ["left", "right"];
Run Code Online (Sandbox Code Playgroud)

这里有一个关于这个主题的旧讨论,有很多相关的问题。也许是对这条消息的希望,但目前还没有完成。