Skip to content

Commit d48d9bc

Browse files
author
Roland Groza
committed
fix: do not use instanceof for type check
1 parent 662cbfa commit d48d9bc

File tree

1 file changed

+23
-15
lines changed

1 file changed

+23
-15
lines changed

src/file-selector.ts

Lines changed: 23 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -19,27 +19,30 @@ const FILES_TO_IGNORE = [
1919
* @param evt
2020
*/
2121
export async function fromEvent(evt: Event | any): Promise<(FileWithPath | DataTransferItem)[]> {
22-
if (isDragEvt(evt) && evt.dataTransfer) {
22+
if (isObject<DragEvent>(evt) && isDataTransfer(evt)) {
2323
return getDataTransferFiles(evt.dataTransfer, evt.type);
24-
} else if (evt instanceof Event) {
24+
} else if (isChangeEvt(evt)) {
2525
return getInputFiles(evt);
2626
} else if (Array.isArray(evt) && evt.every(item => 'getFile' in item && typeof item.getFile === 'function')) {
2727
return getFsHandleFiles(evt)
2828
}
2929
return [];
3030
}
3131

32-
function isDragEvt(value: any): value is DragEvent {
33-
return !!value.dataTransfer;
32+
function isDataTransfer(value: any): value is DataTransfer {
33+
return isObject(value.dataTransfer);
34+
}
35+
36+
function isChangeEvt(value: any): value is Event {
37+
return isObject<Event>(value) && isObject(value.target);
38+
}
39+
40+
function isObject<T>(v: any): v is T {
41+
return typeof v === 'object' && v !== null
3442
}
3543

3644
function getInputFiles(evt: Event) {
37-
const files = isInput(evt.target)
38-
? evt.target.files
39-
? fromList<FileWithPath>(evt.target.files)
40-
: []
41-
: [];
42-
return files.map(file => toFileWithPath(file));
45+
return fromList<FileWithPath>((evt.target as HTMLInputElement).files).map(file => toFileWithPath(file));
4346
}
4447

4548
// Ee expect each handle to be https://developer.mozilla.org/en-US/docs/Web/API/FileSystemFileHandle
@@ -48,11 +51,12 @@ async function getFsHandleFiles(handles: any[]) {
4851
return files.map(file => toFileWithPath(file));
4952
}
5053

51-
function isInput(value: EventTarget | null): value is HTMLInputElement {
52-
return value !== null;
53-
}
5454

55-
async function getDataTransferFiles(dt: DataTransfer, type: string) {
55+
async function getDataTransferFiles(dt: DataTransfer | null, type: string) {
56+
if (dt === null) {
57+
return [];
58+
}
59+
5660
// IE11 does not support dataTransfer.items
5761
// See https://developer.mozilla.org/en-US/docs/Web/API/DataTransfer/items#Browser_compatibility
5862
if (dt.items) {
@@ -79,7 +83,11 @@ function noIgnoredFiles(files: FileWithPath[]) {
7983
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/from#Browser_compatibility
8084
// https://developer.mozilla.org/en-US/docs/Web/API/FileList
8185
// https://developer.mozilla.org/en-US/docs/Web/API/DataTransferItemList
82-
function fromList<T>(items: DataTransferItemList | FileList): T[] {
86+
function fromList<T>(items: DataTransferItemList | FileList | null): T[] {
87+
if (items === null) {
88+
return [];
89+
}
90+
8391
const files = [];
8492

8593
// tslint:disable: prefer-for-of

0 commit comments

Comments
 (0)