Skip to content

Instantly share code, notes, and snippets.

@Mds92
Last active July 15, 2020 09:21
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save Mds92/091828ea857cc556db2ca0f991fee9f6 to your computer and use it in GitHub Desktop.
Save Mds92/091828ea857cc556db2ca0f991fee9f6 to your computer and use it in GitHub Desktop.
TypeScript Object to FormData, with support for nested objects, arrays and File objects.
static convertModelToFormData(model: any, form: FormData = null, namespace = ''): FormData {
let formData = form || new FormData();
for (let propertyName in model) {
if (!model.hasOwnProperty(propertyName) || model[propertyName] == undefined) continue;
let formKey = namespace ? `${namespace}[${propertyName}]` : propertyName;
if (model[propertyName] instanceof Date) {
formData.append(formKey, this.dateTimeToString(model[propertyName]));
}
else if (model[propertyName] instanceof Array) {
model[propertyName].forEach((element, index) => {
if (typeof element != 'object')
formData.append(`${formKey}[]`, element);
else {
const tempFormKey = `${formKey}[${index}]`;
this.convertModelToFormData(element, formData, tempFormKey);
}
});
}
else if (typeof model[propertyName] === 'object' && !(model[propertyName] instanceof File)) {
this.convertModelToFormData(model[propertyName], formData, formKey);
}
else {
formData.append(formKey, model[propertyName].toString());
}
}
return formData;
}
@parker-mike
Copy link

First of all, namespace is a reserved keyword in TypeScript(HandBook and Microsoft/TypeScript@GitHub).
Also, it seems that you forgot to deal with File since the last else will append "[object File]" to the formData

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment