TypeScript中的never应用场景
在TypeScript中,never
类型是一个类型,它是所有类型的子类型,表示的是永远不会发生的值的类型。这个类型主要在类型系统中用来进行错误检查,确保函数返回值或是变量能够保证永远不会是never
类型。
以下是一些使用never
类型的场景:
- 返回never的函数必须存在无法达成的返回路径:
function error(message: string): never {
throw new Error(message);
}
- 类型守卫(Type Guard):
function isNumber(x: number | string): x is number {
return typeof x === "number";
}
- 类型断言:
const someValue = <T>(): T | undefined => {
// ...一些逻辑
};
const value = someValue() as T; // 如果someValue()返回undefined,这里会抛出错误
- 类型检查不通过时,使用never类型:
type Keys = "success" | "error";
type Response = {
[P in Keys]: P extends "success" ? { value: any } : { message: string };
};
function handleResponse(response: Response) {
if (response.error) {
console.error(response.error.message);
return; // 如果是error,函数结束,返回never
}
// 此处处理response.success
}
- 类型保护:
type A = { type: "A" };
type B = { type: "B" };
function handleValue(value: A | B) {
if (value.type === "A") {
// 在这里,value的类型被缩小为A
} else {
// 在这里,value的类型被缩小为B
}
}
- 类型查询时使用never类型:
type Exclude<T, U> = T extends U ? never : T;
- 类型操作中的分发:
type Extract<T, U> = T extends U ? T : never;
- 类型守卫中的分发:
type ReturnType<T> = T extends (...args: any[]) => infer R ? R : any;
以上都是一些使用never
类型的场景,具体使用时需要根据实际情况来决定。
评论已关闭