是否可以将函数值的返回分配给类型泛型



我正在尝试将函数的布尔结果分配给泛型类型。这可能吗?我有以下架构:

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)
  }

这不是一个完美的代码,但你会得到一些想法。

最新更新