我正在尝试创建一个通用函数,它接受一个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中的字段的交叉点
我到底做错了什么?
太长,读不下去了
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