[Typescript] Step6: Types at Runtime
Step 5: Types at Runtime
This problem often happens when APi return the data.
let cachedAllTeamsList: Promise<ITeam[]>;
export async function getAllTeams(): Promise<ITeam[]> {
if (typeof cachedAllTeamsList === 'undefined')
cachedAllTeamsList = apiCall('teams');
return await cachedAllTeamsList;
}
In this line of code: apiCall('teams');
It is actually Promise<any>
, and because we set cachedAllTeamsList: Promise<ITeam[]>
, we cannot make sure whether there is any wired types going on.
Way to solve the problem is by: asserting and throw if the types we want is different.
function isITeam(arg: any): arg is ITeam {
/**
* {
iconUrl: string;
name: string;
id: string;
channels: IChannel[];
}
*/
return (
typeof arg.iconUrl === 'string' &&
typeof arg.name === 'string' &&
typeof arg.id === 'string' &&
Array.isArray(arg.channels)
);
}
function assertIsTypedArray<T>(
arg: any,
check: (val: any) => val is T,
): asserts arg is T[] {
if (!Array.isArray(arg)) {
throw new Error(`Not an array: ${JSON.stringify(arg)}`);
}
if (arg.some((item) => !check(item))) {
throw new Error(`Violators found: ${JSON.stringify(arg)}`);
}
}
let cachedAllTeamsList: Promise<ITeam[]>;
export async function getAllTeams(): Promise<ITeam[]> {
if (typeof cachedAllTeamsList === 'undefined')
cachedAllTeamsList = apiCall('teams').then((teams) => {
assertIsTypedArray(teams, isITeam);
return teams;
});
return await cachedAllTeamsList;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
2017-08-30 [React & Debug] Quick way to debug Stateless component
2017-08-30 [D3] Drawing path in D3
2016-08-30 [Redux + Webpack] Hot reloading Redux Reducers with Webpack