当前位置: 首页 > 知识库问答 >
问题:

使用条件类型的泛型函数中的返回类型问题

鲁华皓
2023-03-14

我正在尝试创建一个通用函数,它接受一个FieldType,并返回一个对象,该对象包含公共基类型的属性以及特定类型FormField的默认值。出于某种原因,如果没有编译器的抱怨,我无法让它工作。我不确定问题出在哪里,但是

我怀疑这可能是将FormField类型定义为条件类型的方式。我尝试过以各种方式重新定义我的类型,但没有成功,所以我怀疑我要么错过了一些明显的东西,要么没有类型断言是不可能的。

以下是我的类型:

type FieldType = 'text' | 'number' | 'custom'

interface FormFieldBase {
  type: FieldType
  label: string
  error: string
  disabled: boolean
}

interface CustomField extends FormFieldBase {
  value: string
}

interface TextField extends FormFieldBase {
  value: string
  placeholder: string
}

interface NumberField extends FormFieldBase {
  value: number
}

type FormField<T extends FieldType> = T extends 'text'
  ? TextField
  : T extends 'number'
  ? NumberField
  : CustomField

以下是我的通用函数:

const createBaseField = <T extends FieldType>(
  type: T
): FormFieldBase => ({
  type,
  label: '',
  error: '',
  disabled: false
})

const defaultValues: {
  [K in FieldType]: Omit<FormField<K>, keyof FormFieldBase>
} = {
  text: {
    value: '',
    placeholder: ''
  },
  checkbox: {
    value: false
  },
  custom: {
    value: ''
  },
  number: {
    value: 0
  }
}

const fieldCreator = <T extends FieldType>(type: T): FormField<T> => ({
  ...createBaseField(type),
  ...defaultValues[type]
})

field Creator产生以下错误:

类型{Type:FieldType;标签:string;错误:string;禁用:boolean;}

在我看来,FormFieldBase(fromcreateBaseField)和FormField中的字段的交叉点

我到底做错了什么?


共有1个答案

法景明
2023-03-14

太长,读不下去了

FormField

较长版本

请注意,您的FormField

现在,您的fieldCreator函数签名声明它返回一个FormField

const a = fieldCreator("text"); //& Pick<TextField<"text">, "value" | "placeholder">

为简洁起见,FormFieldBase类型被省略。正如您可以清楚地看到的,返回类型有关于其形状的附加信息,而FormField中没有这些信息

因此,当您明确地说field Creator函数返回FormField时

const a = fieldCreator("text");
a.value; //string
a.placeholder; //string

const b = fieldCreator("number");
b.placeholder; //error
b.value; //number

旁白:如果您使用泛型,请一直使用-FormFieldBase应接受FieldType作为类型参数,以及扩展接口和默认常量的类型。请参阅操场链接。

 类似资料:
  • 我正在尝试一个非常基本(人为)的条件类型函数,但遇到了意外错误: 我认为这是一个非常简单的条件类型用法,所以不确定发生了什么。有什么想法吗?

  • 我想通过TypeScript泛型定义函数返回类型。所以R可以是我将定义的任何东西。 <代码>。。。许诺 错误:(29,9)TS2322:类型“字符串”不可分配给类型“R”。“字符串”可分配给类型“R”的约束,但“R”可以用约束“{}”的不同子类型实例化。

  • 我试图创建一个Java方法,它接受一个对象类型和它应该转换成的数据类型。 例如,如果我应该能够返回一个值1作为Int或双根据需要。我使用类传递数据类型作为参数。 问题:如何使方法泛型以接受基于输入参数的返回类型? 下面的代码只是一个示例,它可能在语法上不正确,用于解释我的问题。

  • (沙盒) 获取此错误: 类型“number”不可分配给类型“T”“number”可分配给“T”类型的约束,但“T”可以用约束{}的不同子类型实例化。(2322)输入。ts(1,26):预期类型来自此签名的返回类型。 我希望typescript能够自动推断T为数字,然后直接使用它。为什么它在抱怨?写这样的东西的正确方法是什么?谢谢

  • 我试图约束泛型函数的返回类型。(为了简化示例,请忽略函数的实际“有用性”)。 但是返回语句会导致打字错误- -这让我很困惑。在我的理解中,

  • 我试图创建一个返回泛型类型参数的方法。 我有一个类车辆订单扩展抽象类订单。在类订单中,我创建了一个抽象方法接收HiredObject。这个方法不会接收任何参数,并将返回一个泛型。 我在VehicleOrder类中实现了这个方法,并将其设置为返回类参数vehicle。 问题是,当我实例化一个新的VeilceOrderorororororororororororororderororororororo