ts这样的类型怎么写呢?

const <T>() => {
 const t: T = await api() // 接口获取的

 // 标红
 // Property 'list' does not exist on type 'NonNullable'.
 console.log(t.list)
}

这个咋解决哇?

阅读 3k
4 个回答

api 函数设计有问题, 实际上应该是 api<T>(), 泛型T没有list属性, 所以需要设置一个泛型上限。

const <T extends { list: string[] }>() => {
  const t = await api<T>() // 接口获取的

  // 正确
  console.log(t.list)
}
const <T>() => {
 const t: T = await api() as T // 这里加个as你定义的类型,为外来数据指定类型

 // 标红
 // Property 'list' does not exist on type 'NonNullable'.
 console.log(t.list)
}

如果是希望整个函数以类型 T 来标志返回类型的话,那么 api() 这个函数本身也应当是一个泛型函数,即api<T>()。而这个传给 api<T>()的类型T会被用于标注 api这个函数的返回值类型。

如果楼主只是为了解决标红,@Sora的方法就差不多了,其实用any可以更简单粗暴的搞定飘红问题,可是这是否是你想要的?至少我是不允许我的组员这么干的。ts除了可以有效的进行语法检查外对于代码可读性也有极大帮助,甚至后者是更重要的。相似功能的示例代码如下,供参考

// 全局类型声明文件中
export interface StandardResponse<T> {
    status: number;
    message?: string;
    data: T
}
// 结构体声明文件中
export interface DemoData {
    id?: string;
    name: string;
}
// API请求封装文件中
export async function getDemoData(id: string): Promise<StandardResponse<DemoData>> {
    return request(`${url}/${id}`);
}
// 组件内
const getDemo = async (): Promise<DemoData> => {
    const resolve = await getDemoData('1');
    return resolve.data;
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题