TypeScript Style
Prefer satisfies Over as
Avoid as type assertions and especially as any. Use satisfies when checking object literals, mocks, config objects, fixture data, and expected rows.
Bad:
const config = { port: 3000, host: 'localhost' } as ServerConfig;
const ctx = { fetchDirent: vi.fn(), addReadHistory: vi.fn() } as any;
Good:
const config = { port: 3000, host: 'localhost' } satisfies ServerConfig;
const ctx = { fetchDirent: vi.fn(), addReadHistory: vi.fn() } satisfies MockContext;
Use as const satisfies
Use as const satisfies for static literal data when preserving exact literal values or readonly tuples helps TypeScript catch mistakes.
Good:
const ROUTES = {
home: '/',
about: '/about',
} as const satisfies Record<string, string>;
Good for table-driven cases:
const reportCases = [
{ type: 'daily', period: '2026-05-16' },
{ type: 'monthly', period: '2026-05' },
] as const satisfies readonly ReportCase[];
Acceptable as
Use as only when satisfies cannot express the operation, such as narrowing data returned from an external untyped boundary or adapting to an API that requires a nominal type. Keep it local and avoid as any.
Prefer @ts-expect-error
Use @ts-expect-error instead of @ts-ignore, and include a short explanation. @ts-expect-error fails when the underlying type error disappears, so stale suppressions are caught.
Bad:
// @ts-ignore
import privateApi from 'some-package/private-api';
Good:
// @ts-expect-error Private runtime API has no public type declaration.
import privateApi from 'some-package/private-api';