typescript 如何使用自定义联合作为要在运行时检查类型

e5nqia27  于 2023-01-21  发布在  TypeScript
关注(0)|答案(1)|浏览(112)

我想使用一个自定义的联合体,或者通常在io-ts中使用一个自定义类型。
我收到一个错误,例如
T.array(T.type(MyUnion))
你能告诉我实现这一目标的正确途径是什么吗?

import * as T from 'io-ts';
import * as E from 'fp-ts/Either';
import { pipe } from 'fp-ts/lib/function';

console.clear();

type MyUnion = 'item-a' | 'item-b' | 'item-c';

const test1 = T.type({
  data: T.array(T.string),
});

pipe(test1.decode({ data: ['hello'] }), E.fold(console.error, console.log)); // OK

const test2 = T.type({
  data: T.array(T.type(MyUnion)), // ERROR
});

pipe(test2.decode({ data: ['hello'] }), E.fold(console.error, console.log));
oo7oh9g9

oo7oh9g91#

您需要定义一个名为MyUnion的变量,以便可以在运行时首先使用:

const MyUnion = T.union([T.literal("item-a"), T.literal("item-b"), T.literal("item-c")]);

但是再次使用这个方法是非常多余的

type MyUnion = 'item-a' | 'item-b' | 'item-c';

幸运的是,io-ts有一个内置的类型TypeOf,它将io-ts类型的类型作为TS类型,这样就消除了冗余:

type MyUnion = T.TypeOf<typeof MyUnion>;
//   ^? 'item-a' | 'item-b' | 'item-c'

然后你就可以将MyUnion同时用作io-ts类型(在运行时)和TS类型(在编译时):

const test2 = T.type({
  data: T.array(MyUnion), // ok
});

Playground

相关问题