#javascript #html #typescript
#javascript #HTML #машинописный текст
Вопрос:
Я передаю File
объект, который приходит из браузера (путем удаления), в функцию, подобную этой:
// .... logic here...
accept(file)
public static accept(file: File) {
console.log(file)
/* prints:
=> lastModified: 1555453309243
lastModifiedDate: Wed Apr 17 2019 01:21:49 GMT 0100 (GMT 01:00) {}
name: "test.txt"
path: "test.txt" --> as you can see there is a path variable in here.
size: 16
type: "text/plain"
webkitRelativePath: ""
__proto__: File
*/
console.log(file.name) // => prints 'test.txt'
console.log(file.size) // => prints '16'
console.log(file.path) // => !! error given. path does not exists in File object. Also IDE does not show this parameter in IDE autocomplete list.
}
Ошибка дана:
Property 'path' does not exist on type 'File'.ts(2339)
File
Почему нет path
параметра? Как я могу убедиться, что path существует? Есть ли какой- нибудь другой тип для File
? Это удаление HTML5.
Если я сделаю это:
public static accept(file: any) {
alert(file.path);
}
Он показывает относительный путь:
Комментарии:
1. Я могу получить к нему доступ. Это проект перетаскивания HTML5. Я обновил вопрос. Взгляните на это. Я просто не могу использовать статическую типизацию. Как я могу обмануть IDE и webpack, что
path
в нем есть a??2. Если недвижимость есть , вы всегда можете получить к ней доступ
(file as any).path
.3. @mbojko Да, это сделало свое дело. Спасибо! Вы можете написать это как ответ.
4. В идеале вы должны создать свой собственный интерфейс
interface MyFile extends File { path: string; /* etc */ }
и использовать его. Однако где задокументировано, чтоFile
уpath
него есть свойство? Вы должны знать, поддерживаете ли вы только какую-то конкретную или нестандартную среду.5. Ах, значит, React-Dropzone добавляет это свойство. Я бы подумал, что это должно быть частью типизации TypeScript для React-Dropzone… возможно
DropZoneFile
, илиDropZoneFolder
, который расширяетсяFile
с помощью необязательногоpath
свойства? Поскольку они не сделали этого в библиотеке, я думаю, вам нужно сделать это для вашего собственного кода.
Ответ №1:
Для тех, кто еще использует react-dropzone
, кажется, что они получают набор текста FileWithPath
из этой библиотеки file-selector
Смотрите строку 3 здесь: https://github.com/react-dropzone/react-dropzone/blob/master/typings/react-dropzone.d.ts
Вы можете просто импортировать это FileWithPath
из react-dropzone
любого места, где вам это нужно.
Ответ №2:
Ответ Китсона верен. Я просто хотел добавить точный способ реализации этого ответа для тех, кто новичок в Typescript. Если вы только начинаете с базового примера в документах Dropzone, вы можете просто добавить FileWithPath
к своему импорту react-dropzone
и определить тип каждого файла, поступающего с карты. Обратите внимание на два добавления FileWithPath
здесь:
import { useDropzone, FileWithPath } from "react-dropzone";
function Basic(props) {
const {acceptedFiles, getRootProps, getInputProps} = useDropzone();
const files = acceptedFiles.map((file: FileWithPath) => (
<li key={file.path}>
{file.path} - {file.size} bytes
</li>
));
...
Ответ №3:
interface FileWithPath extends File {
path: string
}
const path = (file as FileWithPath).path