我正在尝试将函数的布尔结果分配给泛型类型。这可能吗?我有以下架构:
interface FormalWebFieldProps {
name: string
id: string
onChange: (e: FormalTextFieldEvent) => void
}
interface FormalNativeFieldProps {
onChangeText: (text: string) => void
}
type FormalFieldProps<IsNative> = {
disabled: boolean
value: any
error?: string
} & (IsNative extends true ? FormalNativeFieldProps : FormalWebFieldProps)
如果我只是将<true>
或<false>
传递给通用类型的FormalFieldProps
,它可以工作:
const getWebFieldProps = (): FormalFieldProps<false> => {
return {
id: 'field id',
name: 'field name',
disabled: false,
value: 'foo',
error: 'error',
onChange: e => console.log(e.target.value)
}
}
const getNativeFieldProps = (): FormalFieldProps<true> => {
return {
disabled: false,
value: 'foo',
error: 'error',
onChangeText: text => console.log(text)
}
}
但是,由于此验证是动态的并且发生在运行时,因此我不知道是否可以将该函数的返回分配给泛型类型,如下所示:
const isNative = () => false
const getDynamicFieldProps = (): FormalFieldProps<bool = isNative()> => {
const extra = !isNative() ? {
id: 'field id',
name: 'field name',
onChange: e => console.log(e.target.value)
} : {
onChangeText: text => console.log(text)
}
return {
disabled: false,
value: 'foo',
error: 'error',
...extra
}
}
尝试将你的标志声明为普通声明,例如是负 = 假;
在三元运算符的帮助下,您可以执行代码块
喜欢
isNegative? {
id: 'field id',
name: 'field name',
disabled: false,
value: 'foo',
error: 'error',
onChange: e => console.log(e.target.value)
}: {
disabled: false,
value: 'foo',
error: 'error',
onChangeText: text => console.log(text)
}
这不是一个完美的代码,但你会得到一些想法。