6

我正在尝试创建以下的 io-ts 接口

我的界面.ts

export interface myInterface {
  [key:string]?: string | undefined | null
}

我想把它变成 io-ts 等价物。最终目标是将其与另一个现有的 io-ts 接口结合起来

我的其他interface.ts

export const MyOtherInterfaceV = t.interface({
  requiredProp1: ValidString// custom type, checks string is populated
  requiredProp2: ValidString
  // All other fields marked as required
})

export type MyOtherInterface = t.TypeOf<typeof MyOtherInterfaceV>;

我的想法是我需要一个类型来表示一个有效负载,该有效负载将包含一些我们需要且必须有效的字段,以及一些我们不知道且可以是可选的字段。我们希望将这些组合起来,以便稍后在处理中使用,最终存储在 dynamodb 中

4

2 回答 2

8

我认为您正在寻找的答案是记录:

const myInterfaceCodec = t.record(t.string, t.union([t.string, t.undefined, t.null]));
export type MyInterface = t.TypeOf<typeof myInterfaceCodec>;

=> type MyInterface = { [x: string]: string | 空 | 不明确的; }

您的用例:

const myInterfaceV = t.record(t.string, t.union([t.string, t.undefined, t.null]));
export type MyInterface = t.TypeOf<typeof myInterfaceV>;

const myOtherInterfaceV = t.intersection([
    t.type({
        requiredProp1: t.string,
        requiredProp2: t.string
    }),
    myInterfaceV
]);
export type MyOtherInterface = t.TypeOf<typeof myOtherInterfaceV>;

const a: MyOtherInterface = {
    requiredProp1: "string",
    requiredProp2: "string2"
};

const b: MyOtherInterface = {
    requiredProp1: "string",
    requiredProp2: "string2",
    optionalProp1: "hello",
    optionalProp2: "world"
};
于 2020-08-14T08:49:30.467 回答
1

可能最接近io-tsmyInterface的是t.UnknownRecord

export const MyOtherInterfaceV = t.interface({
  requiredProp1: t.string,
  requiredProp2: t.string
})

const MyOtherInterface = t.intersection([ t.UnknownRecord, MyOtherInterfaceV ]);
于 2020-08-06T17:15:26.233 回答