有没有一种方法可以从作为泛型传递的接口中推断特定值的类型?

谢恩

由于我是TS的新手,我很可能会错误地处理这个问题,但是我想知道我是否有某种通用类型可以通过它传递一个看起来像是{[key: string]: string | boolean}可以知道任何特定类型的接口的接口。使用该泛型的函数中的值。

例如,我有一个类似的界面:

export interface Address {
    addressId: string;
    firstName: string;
    lastName: string;
    addressType: string;
    addressLine1: string;
    addressLine2: string;
    city: string;
    state: string;
    country: string;
    zipCode: string;
    email1: string;
    phone1: string;
    primary: boolean;
    nickName?: string;
}

我正在尝试做这样的事情:

function useForm<T>(initialValues: T) {
  const [form, setForm] = useState<T>(initialValues);

  const field = (key: keyof T) => {

    const setValue = (newValue: T[keyof T]) => {
      const newState = {
        ...form,
        [key]: newValue
      }
      setForm(newState);
    }
    const value = form[key];
    return {
      value,
      setValue
    };
  }

  return {
    form,
    field,
  };
}

我的textField有一个看起来像这样的接口

interface TextFieldProps {
  field: {
    setValue: (value: string) => void;
    value: string;
  };
  label?: string;
  placeholder?: string;
  containerStyle?: ViewStyle;
}

以我的形式看起来像

const {form, field} = useForm<Address>(someInitialAddress);
...
<TextField field={form("FirstName")} />
...

如果您尝试加载接口上不存在的字段,则已经引发了类型错误,但是我想提防确保您没有将基于布尔值的值或其他内容加载到该字段中,而我当前收到此类型错误: Type '{ value: string | boolean | undefined; setValue: (newValue: string | boolean | undefined) => void; }' is not assignable to type '{ setValue: (value: string) => void; value: string; }'.

任何帮助将不胜感激,谢谢!

谢恩

看来这符合我的需求:

function useForm<T>(initialValues: T) {
  const [form, setForm] = useState<T>(initialValues);

  function field<K extends keyof T>(key: K) {
    function setValue<PropType extends T[K]>(newValue: PropType) {
      const newState = {
        ...form,
        [key]: newValue,
      };
      setForm(newState);
    };
    const value = form[key];
    return {
      value,
      setValue,
    };
  };

  return {
    form,
    field,
  };
}

当这样使用时:

interface Address {
    addressId: string;
    firstName: string;
    lastName: string;
    addressType: string;
    addressLine1: string;
    addressLine2: string;
    city: string;
    state: string;
    country: string;
    zipCode: string;
    email1: string;
    phone1: string;
    primary: boolean;
    nickName?: string;
}

...
const { field, onSubmit } = useForm<Address>(someInitialAddress);
...
<TextField
  field={field('firstName')}
  label="First Name"
  placeholder="First Name"
/>

This returns the field prop as:
field: {
  setValue(value: string): void;
  value: string;
};

...

<CheckboxField
  field={field('primary')}
  label="Use as my primary address for Billing and Shipping"
/>
This returns the field prop as:
field: {
  setValue(value: boolean): void;
  value: boolean;
};

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

有没有一种方法可以从TypeScript中的泛型类型推断出泛型类型?

来自分类Dev

有没有一种方法可以导致传递给Control.BeginInvoke的委托的类型推断?

来自分类Dev

有没有一种方法可以将泛型类型限制为一组类型的成员?

来自分类Dev

有没有一种方法可以检查委托是值还是引用类型?

来自分类Dev

Haskell:有没有一种方法可以从函数内部推断出函数的返回类型?

来自分类Dev

有没有一种方法可以推断出C ++中数组的单个元素的类型

来自分类Dev

有没有一种方法可以推断出C ++中数组的单个元素的类型

来自分类Dev

有没有一种方法可以创建类或匿名对象以在方法内的泛型<>中使用?

来自分类Dev

有没有一种方法可以将类强制转换为具有特定参数的类java.lang.Class <>泛型?

来自分类Dev

有没有一种方法可以检查泛型类的字段是否存在?

来自分类Dev

TypeScript:有没有一种方法可以像泛型那样实现道具传播?

来自分类Dev

有没有一种方法可以使用Class <T>处理嵌套泛型

来自分类Dev

有没有一种方法可以指定嵌套的泛型而不在Java 8+中两次指定类型

来自分类Dev

有没有一种方法可以使用对象的类型作为类型参数的参数?

来自分类Dev

有没有一种方法可以使用动态字段名称构建类型接口?

来自分类Dev

有没有一种方法可以计算函数内部的长度而不是作为参数传递?

来自分类Dev

C#:有没有一种方法可以将枚举作为参数传递?

来自分类Dev

有没有一种方法可以将一组值作为Oracle SQL语句中的参数传递

来自分类Dev

有没有一种方法可以防止UILabel作为UIView进行类型检查?

来自分类Dev

有没有一种方法可以在接口上声明计算属性?

来自分类Dev

有没有一种方法可以将vue模型值传递给方法函数?

来自分类Dev

有没有一种方法可以找到并返回具有特定值的属性?

来自分类Dev

有没有一种方法可以获取作为属性的构建状态?

来自分类Dev

有没有一种方法可以获取元组的键作为数字?

来自分类Dev

有没有一种方法可以将屏幕上的按钮作为目标?

来自分类Dev

有没有一种方法可以为类的特定属性隐藏一些枚举值?

来自分类Dev

有没有一种方法可以将流引用传递给对象?

来自分类Dev

有没有一种方法可以将Runnable(或Callable)传递给IntentService?

来自分类Dev

有没有一种方法可以从包含特定值的对象中查找()随机元素

Related 相关文章

  1. 1

    有没有一种方法可以从TypeScript中的泛型类型推断出泛型类型?

  2. 2

    有没有一种方法可以导致传递给Control.BeginInvoke的委托的类型推断?

  3. 3

    有没有一种方法可以将泛型类型限制为一组类型的成员?

  4. 4

    有没有一种方法可以检查委托是值还是引用类型?

  5. 5

    Haskell:有没有一种方法可以从函数内部推断出函数的返回类型?

  6. 6

    有没有一种方法可以推断出C ++中数组的单个元素的类型

  7. 7

    有没有一种方法可以推断出C ++中数组的单个元素的类型

  8. 8

    有没有一种方法可以创建类或匿名对象以在方法内的泛型<>中使用?

  9. 9

    有没有一种方法可以将类强制转换为具有特定参数的类java.lang.Class <>泛型?

  10. 10

    有没有一种方法可以检查泛型类的字段是否存在?

  11. 11

    TypeScript:有没有一种方法可以像泛型那样实现道具传播?

  12. 12

    有没有一种方法可以使用Class <T>处理嵌套泛型

  13. 13

    有没有一种方法可以指定嵌套的泛型而不在Java 8+中两次指定类型

  14. 14

    有没有一种方法可以使用对象的类型作为类型参数的参数?

  15. 15

    有没有一种方法可以使用动态字段名称构建类型接口?

  16. 16

    有没有一种方法可以计算函数内部的长度而不是作为参数传递?

  17. 17

    C#:有没有一种方法可以将枚举作为参数传递?

  18. 18

    有没有一种方法可以将一组值作为Oracle SQL语句中的参数传递

  19. 19

    有没有一种方法可以防止UILabel作为UIView进行类型检查?

  20. 20

    有没有一种方法可以在接口上声明计算属性?

  21. 21

    有没有一种方法可以将vue模型值传递给方法函数?

  22. 22

    有没有一种方法可以找到并返回具有特定值的属性?

  23. 23

    有没有一种方法可以获取作为属性的构建状态?

  24. 24

    有没有一种方法可以获取元组的键作为数字?

  25. 25

    有没有一种方法可以将屏幕上的按钮作为目标?

  26. 26

    有没有一种方法可以为类的特定属性隐藏一些枚举值?

  27. 27

    有没有一种方法可以将流引用传递给对象?

  28. 28

    有没有一种方法可以将Runnable(或Callable)传递给IntentService?

  29. 29

    有没有一种方法可以从包含特定值的对象中查找()随机元素

热门标签

归档