TypeScript
Generic Type
Generics let you parameterize types so they can be reused across different shapes.
Common generic utilities and examples:
Array<ItemType>Promise<ReturnedType>Readonly<T>Partial<T>Record<KeyType, ValueType>
Example:
ts
function wrap<T>(value: T): { data: T } {
return { data: value };
}
const r1 = wrap<string>('hello');
const r2 = wrap(123); // T is inferred as numberWhat are the primitive types in TypeScript?
string,number,boolean,bigint,symbol,null,undefined.
What is any type, and when to use it?
anydisables type checking for a value. Use sparingly.- Implicit
anycan occur when the compiler cannot infer a type and no annotation is provided. - Prefer
unknownor specific types to keep safety.
What is void, and when to use the void type?
voidindicates a function returns no value.
ts
function log(msg: string): void {
console.log(msg);
}What is an unknown type, and when to use it in TypeScript?
unknownis a type-safe counterpart ofany.- You can assign anything to
unknown, but you must narrow it before using it.
ts
function handle(input: unknown) {
if (typeof input === 'string') {
// narrowed to string
console.log(input.toUpperCase());
}
}Note to Create Strongly typed Component Events and Event Handlers
- Inline event handlers often infer correct types automatically.
- Named handlers may require explicit annotations.
- Tip: hover handlers in your editor to see inferred types.
tsx
function Input() {
const onKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {
console.log(e.key);
};
return <input type="text" onKeyDown={onKeyDown} />;
}"<input type=""text"" onKeyDown={e:React.KeyboardEvent<HTMLInputElement> => console.log(e.key)} /> What is wrong?"
You must wrap the parameter and annotation in parentheses.
Correct:
tsx
<input type="text" onKeyDown={(e: React.KeyboardEvent<HTMLInputElement>) => console.log(e.key)} />declare type for actions and dispatchs of redux-thunk
ts
import { AnyAction } from 'redux';
import { ThunkAction, ThunkDispatch } from 'redux-thunk';
type AppState = {
/* ... */
};
export type AppThunk<ReturnType = void> = ThunkAction<ReturnType, AppState, unknown, AnyAction>;
export type AppDispatch = ThunkDispatch<AppState, unknown, AnyAction>;declare enum type
ts
enum Status {
Idle = 'idle',
Loading = 'loading',
Success = 'success',
Error = 'error',
}
function setStatus(s: Status) {}
setStatus(Status.Loading);