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

时间:2019-03-26 16:31:38

标签: typescript

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

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

1 个答案:

答案 0 :(得分:0)

尝试将您的标志声明为正常声明,例如 isNegative = false;

并在三元运算符的帮助下,您可以执行代码块

喜欢

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

这不是完美的代码,但是您会有所了解。