【问题标题】:How to globally redefine the FormData TypeScript interface in React Native?如何在 React Native 中全局重新定义 FormData TypeScript 接口?
【发布时间】:2020-01-06 19:05:04
【问题描述】:

当像这样在 React Native 中使用 FormData 做一个简单的append 时...

const formData = new FormData();
formData.append('image-data', {
  uri: '/awesome-chat-app/ImagePicker/abb9-a435046e971c.jpg',
  name: 'image001.jpg',
  type: 'image/jpeg',
});


TypeScript 抱怨...

'{ uri: any; 类型的参数名称:字符串;类型:字符串; }' 不能分配给类型为 'string |斑点'。 对象字面量只能指定已知属性,而 'uri' 不存在于类型 'Blob'.ts(2345)


所以我能够像这样重新定义 FormData... (hat tip)

interface FormDataValue {
  uri: string;
  name: string;
  type: string;
}

interface FormData {
  append(name: string, value: string | Blob | FormDataValue, fileName?: string): void;
  delete(name: string): void;
  get(name: string): FormDataEntryValue | null;
  getAll(name: string): FormDataEntryValue[];
  has(name: string): boolean;
  set(name: string, value: string | Blob | FormDataValue, fileName?: string): void;
}

declare let FormData: {
  prototype: FormData;
  new (form?: HTMLFormElement): FormData;
};

interface FormData {
  entries(): IterableIterator<[string, string | File]>;
  keys(): IterableIterator<string>;
  values(): IterableIterator<string | File>;
  [Symbol.iterator](): IterableIterator<string | File>;
}


这直接在我正在做的文件中非常有效append

如何在项目中全局定义它以覆盖 FormData 的所有使用?

【问题讨论】:

  • 也许可以尝试把它放在像formData.d.ts这样的文件中
  • 我试过了,但它似乎不起作用。也许需要添加一些东西才能让它以这种方式工作?

标签: javascript typescript


【解决方案1】:

使用全局ambient module 通过interface merging 扩展lib.dom.d.ts 中定义的FormData 接口:

declare global {
  interface FormDataValue {
    uri: string;
    name: string;
    type: string;
  }

  interface FormData {
    append(name: string, value: FormDataValue, fileName?: string): void;
    set(name: string, value: FormDataValue, fileName?: string): void;
  }
}

【讨论】:

  • 感谢您的帮助!我在项目的顶层创建了一个typings 文件夹,然后使用您发布的代码创建了一个formdata.d.ts 文件,但仍然出现错误。抱歉,我在这方面非常幼稚,需要更多详细信息。
  • 无论你在哪里使用它,你都需要一个/// &lt;reference path="formdata.d.ts"/&gt;,因为你把它放在typings中。
  • 谢谢帕特里克。经过更多阅读,我创建了一个global.d.ts 文件并将您的代码放在那里。这似乎不需要导入,也不需要declare global {} 部分。界面合并很酷! ? 再次感谢杰里米。
  • 直到在我的 react native expo 项目的底部添加 export {}; 后它才起作用。 stackoverflow.com/a/62011156/6414615
  • @types/react-native 已经包含了一个与 RN 兼容的 FormData 定义:github.com/DefinitelyTyped/DefinitelyTyped/blob/… 因此,如果您将 @types/react-native 作为依赖项,似乎不需要为它编写你自己的 .d.ts 文件。有谁知道这是怎么回事?
猜你喜欢
  • 2015-10-11
  • 1970-01-01
  • 2017-07-03
  • 1970-01-01
  • 1970-01-01
  • 2018-05-24
  • 1970-01-01
  • 1970-01-01
  • 2015-12-03
相关资源
最近更新 更多