typescript 如何将内部模式标记为可选?

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

bounty将在6天后过期。回答此问题可获得+50的声望奖励。baitendbidz正在寻找规范答案

给定以下ajv(v8.11.2)示例模式

import Ajv, { JSONSchemaType } from "ajv";

interface MyType {
    myProp?: OtherType;
}

interface OtherType {
    foo: string;
    bar: number;
}

const otherSchema: JSONSchemaType<OtherType> = {
    type: 'object',
    properties: {
        foo: { type: 'string', minLength: 1 },
        bar: { type: 'number' },
    },
    required: ['foo', 'bar'],
    additionalProperties: false
};

const mySchema: JSONSchemaType<MyType> = {
    type: 'object',
    properties: {
        myProp: otherSchema,
    },
    required: [],
    additionalProperties: false,
};

我收到以下错误
属性“$ref”的类型不兼容。请键入“string|“undefined”不能赋值给类型“string”。类型“undefined”不能赋值给类型“string”。
我认为这是因为TS不知道mySchemamyProp可能是未定义的,尽管它不存在于所需的数组中。
你有什么办法来修复这个模式吗?

x0fgdtte

x0fgdtte1#

您应该能够执行以下操作:

import { JSONSchemaType } from "ajv";

interface OtherType {
  foo: string;
  bar: number;
}

interface MyType {
  myProp?: OtherType;
}

export const otherSchema: JSONSchemaType<OtherType> = {
  type: "object",
  properties: {
    foo: { type: "string", minLength: 1 },
    bar: { type: "number" }
  },
  required: ["foo", "bar"],
  additionalProperties: false
};

export const mySchema: JSONSchemaType<MyType> = {
  type: "object",
  properties: {
    // nest your objects inside "properties"
    myProp: {
      ...otherSchema,
      nullable: true // this nullable param is important!
    }
  },
  required: [],
  additionalProperties: false
};

下面是一个工作示例:
https://codesandbox.io/s/ajv-schema-json-nested-qu9e7q?file=/src/schemas.ts

llycmphe

llycmphe2#

正如在注解中提到的,我假设这是因为您在MyType中声明了myProp的类型为OtherType,但是当您声明模式时,您将JSONSchemaType<MyType>类型的对象设置为该属性,并且TypeScript会告诉您类型不匹配,因为OtherType不是JSONSchemaType<OtherType>
尝试将您的MyType调整为:

interface MyType {
  myProp?: JSONSchemaType<OtherType>;
}

虽然我从来没有使用过ajv包,也不知道JSONSchemaType类型和它需要什么来实现。但我的回答应该涵盖您发布的错误

相关问题