如何使用yup的对象.形状和 typescript ?

ttvkxqim  于 2022-12-19  发布在  TypeScript
关注(0)|答案(2)|浏览(163)

我目前正在将一段代码转换为TypeScript,遇到了一些yup类型的类型问题。我尝试了多种方法,并参考了yup关于TypeScript支持的文档来解决这个问题,但无济于事。
https://github.com/jquense/yup/blob/master/docs/typescript.md
下面是我的代码示例:

import { object, Asserts, string } from 'yup';

interface BaseBootstrapSchema {  
  APPLICATION_NAME: string;
  LOG_PATH: string;
}

const bootstrapValidationSchema = object<BaseBootstrapSchema>().shape({ // error 1 here
  LOG_PATH: string().required("The 'LOG_PATH' ENV variable is required"),
  APPLICATION_NAME: string().required("The 'APPLICATION_NAME' ENV variable is required"),
});

interface BootstrapSchema extends Asserts<typeof bootstrapValidationSchema> {}

module.exports = (schema: BootstrapSchema) =>
  new Promise((resolve, reject) =>
    schema
      .validate(process.env, { abortEarly: false }) // error 2 here
      .then(() => resolve(true))
      .catch((error: any) => {
        if (error.errors.length > 1) {
          reject(new Error(`${error.message},\n${error.errors.join(',\n')}`));
        } else {
          reject(new Error(error.message));
        }
      })
  );

我得到以下错误:

错误1:

类型“BaseBootstrapSchema”不满足约束“记录〈字符串,任何架构〈任何,任何,任何〉|参考文献|惰性〈any,any〉〉“。类型”BaseBootstrapSchema“中缺少索引签名。

错误2:

类型“BootstrapSchema”上不存在属性“validate”。
我尝试了一些方法来纠正这个问题,但没有真正的工作。
感谢协助。

sz81bmfz

sz81bmfz1#

遵循yup指南here,您应该按如下方式更改代码:

import { object, SchemaOf, string } from 'yup';

interface BaseBootstrapSchema {  
  APPLICATION_NAME: string;
  LOG_PATH: string;
}

const bootstrapValidationSchema: SchemaOf<BaseBootstrapSchema> = object({
  LOG_PATH: string().required("The 'LOG_PATH' ENV variable is required"),
  APPLICATION_NAME: string().required("The 'APPLICATION_NAME' ENV variable is required"),
});

module.exports = (schema: SchemaOf<BaseBootstrapSchema>) =>
  new Promise((resolve, reject) =>
    schema
      .validate(process.env, { abortEarly: false })
      .then(() => resolve(true))
      .catch((error: any) => {
        if (error.errors.length > 1) {
          reject(new Error(`${error.message},\n${error.errors.join(',\n')}`));
        } else {
          reject(new Error(error.message));
        }
      })
  );

实际上,您根本不需要const bootstrapValidationSchema,因为您将把它传递给要导出的节点模块,但我可能误解了您在这里试图实现的目标。Try it

ovfsdjhp

ovfsdjhp2#

如果架构的某个属性是可选的,请使用OptionalObjectSchema和AnySchema类型。

import { object, string, AnySchema } from 'yup';
import { OptionalObjectSchema } from 'yup/lib/object'

interface BaseBootstrapSchema {  
  APPLICATION_NAME: string;
  LOG_PATH: string;
}

const bootstrapValidationSchema: OptionalObjectSchema<Record<keyof BaseBootstrapSchema, AnySchema>> = object({
  LOG_PATH: string(),
  APPLICATION_NAME: string(),
});

相关问题