如何限制TypeScript泛型函数返回类型为对象或数组(排除any与string)
修改TypeScript泛型函数的返回类型约束
要限制泛型返回值只能是任意对象或数组,同时排除any和string,可以通过泛型约束来实现,具体代码和说明如下:
private getItem<T extends Record<string, unknown> | unknown[]>(identifier: string): T { // 原函数逻辑,返回值需符合T的约束 return /* 你的返回值逻辑 */; }
约束细节说明:
Record<string, unknown>:指定T为任意键是字符串类型、值为未知类型的对象,既保证了对象类型的通用性,又避免了any的松散类型问题。unknown[]:覆盖所有元素类型的数组场景,确保数组类型合法。- 两者的联合类型直接排除了
string、number等原始类型,同时any也无法满足该约束,自然被禁止。
可选的严格约束(排除null/undefined):
如果项目未开启严格空值检查,object类型可能包含null,可以通过额外约束排除这类值:
private getItem<T extends (Record<string, unknown> | unknown[]) & {}>(identifier: string): T { return /* 你的返回值逻辑 */; }
这里的& {}会过滤掉null和undefined,因为这两个值无法赋值给非空对象类型。
调用示例:
// 合法调用:返回对象 const user = this.getItem<{ id: number; name: string }>("user-id"); // 合法调用:返回数组 const list = this.getItem<string[]>("item-list"); // 非法调用(TypeScript会直接报错) const str = this.getItem<string>("some-string"); // string类型不符合约束 const anyVal = this.getItem<any>("any-id"); // any类型不符合约束
内容的提问来源于stack exchange,提问作者SCM
相关产品推荐
相关产品推荐

