{}
as a type. {}
actually means "any non-nullish value".
- If you want a type meaning "any object", you probably want object
instead.
- If you want a type meaning "any value", you probably want unknown
instead.
- If you want a type meaning "empty object", you probably want Record<string, never>
instead.
- If you really want a type meaning "any non-nullish value", you probably want NonNullable<unknown>
instead1import type { CommonOldmarrWidgetDefinition } from "./common";
2
3// eslint-disable-next-line @typescript-eslint/no-empty-object-type
4export type OldmarrUsenetDefinition = CommonOldmarrWidgetDefinition<"usenet", {}>;
{}
as a type. {}
actually means "any non-nullish value".
- If you want a type meaning "any object", you probably want object
instead.
- If you want a type meaning "any value", you probably want unknown
instead.
- If you want a type meaning "empty object", you probably want Record<string, never>
instead.
- If you really want a type meaning "any non-nullish value", you probably want NonNullable<unknown>
instead1import type { CommonOldmarrWidgetDefinition } from "./common";
2
3// eslint-disable-next-line @typescript-eslint/no-empty-object-type
4export type OldmarrMediaServerDefinition = CommonOldmarrWidgetDefinition<"media-server", {}>;
{}
as a type. {}
actually means "any non-nullish value".
- If you want a type meaning "any object", you probably want object
instead.
- If you want a type meaning "any value", you probably want unknown
instead.
- If you want a type meaning "empty object", you probably want Record<string, never>
instead.
- If you really want a type meaning "any non-nullish value", you probably want NonNullable<unknown>
instead1import type { CommonOldmarrWidgetDefinition } from "./common";
2
3// eslint-disable-next-line @typescript-eslint/no-empty-object-type
4export type OldmarrDlspeedDefinition = CommonOldmarrWidgetDefinition<"dlspeed", {}>;
{}
as a type. {}
actually means "any non-nullish value".
- If you want a type meaning "any object", you probably want object
instead.
- If you want a type meaning "any value", you probably want unknown
instead.
- If you want a type meaning "empty object", you probably want Record<string, never>
instead.
- If you really want a type meaning "any non-nullish value", you probably want NonNullable<unknown>
instead1import type { CommonOldmarrWidgetDefinition } from "./common";
2
3// eslint-disable-next-line @typescript-eslint/no-empty-object-type
4export type OldmarrUsenetDefinition = CommonOldmarrWidgetDefinition<"usenet", {}>;
{}
as a type. {}
actually means "any non-nullish value".
- If you want a type meaning "any object", you probably want object
instead.
- If you want a type meaning "any value", you probably want unknown
instead.
- If you want a type meaning "empty object", you probably want Record<string, never>
instead.
- If you really want a type meaning "any non-nullish value", you probably want NonNullable<unknown>
instead1import type { CommonOldmarrWidgetDefinition } from "./common";
2
3// eslint-disable-next-line @typescript-eslint/no-empty-object-type
4export type OldmarrMediaServerDefinition = CommonOldmarrWidgetDefinition<"media-server", {}>;
Some builtin types have aliases, some types are considered dangerous or harmful. It's often a good idea to ban certain types to help with consistency and safety.
It includes a set of "best practices", intended to provide safety and standardization in your codebase:
Don't use the upper-case primitive types, you should use the lower-case types for consistency.
Avoid the Function
type, as it provides little safety for the following reasons:
new
keyword.Avoid the Object
and {}
types, as they mean "any non-nullish value".
Avoid the object
type, as it is currently hard to use due to not being able to assert that keys exist.
// use of upper-case primitives
const str: String = 'foo';
const bool: Boolean = true;
const num: Number = 1;
const symb: Symbol = Symbol('foo');
// use a proper function type
const func: Function = () => 1;
// use safer object types
const lowerObj: object = {};
const capitalObj1: Object = 1;
const capitalObj2: Object = { a: 'string' };
const curly1: {} = 1;
const curly2: {} = { a: 'string' };
// use lower-case primitives for consistency
const str: string = 'foo';
const bool: boolean = true;
const num: number = 1;
const symb: symbol = Symbol('foo');
// use a proper function type
const func: () => number = () => 1;
// use safer object types
const lowerObj: Record<string, unknown> = {};
const capitalObj1: number = 1;
const capitalObj2: { a: string } = { a: 'string' };
const curly1: number = 1;
const curly2: Record<'a', string> = { a: 'string' };