I've been appreciating a TypeScript pattern called type-guards.
Type-guards provide type-safety by performing a runtime check to ensure a variable is within the typed scope.
/** * Type-Guard: Asserts that the document is a S3 file */ export const isS3Document = (document: Document): document is S3Document => "url" in document;
You could use the type-guard as such:
const onlyS3Files = (files: Document): S3Document => files.filter(isS3Document);
To create a type-guard, you must:
- Return a type predicate (e.g.
variable is S3Document)
- Contain a logical statement to determine the type of the given variable
With this in view, you can also create a generic type-guard that can be used to assert the type safety of any variable:
export const isType = <T>(variable: any, property: keyof T): variable is T => (variable as T)[property] !== undefined;
const onlyS3Files = (files: Document): S3Document => files.filter((document) => isType<S3Document>(document, "url"));