默认情况下,对象是由Promise返回的,据我所知,我需要有一个awaitthen来初始化RES到另一个本地创建的对象的映射.

Axios呼叫

async getAllCourses() {
    try {
        const res = await request.get<ResponseData>("/v1/courses");

        return res.data

    } catch (err) {
        console.error(err)
    }
},

这很管用

let results: Course[];

let courses = api.getAllCourses().then((res: ResponseData) => {

    results = res.data

    return results
})

然而,这并不意味着:

let courses = await api.getAllCourses().then((res: ResponseData) => {

    let c: Course[];
    c = res.data

    return c
})

export default interface ResponseData {
    data: any;
}

-数据来自服务器

{
    "data": [
        {
            "ObjectId": "649419c9e26f71024a0d5901",
            "id": "",
            "title": "算法rithms",
            "description": "An awesome GO course",
            "lessons": "5",
            "duration": "7 hours",
            "course_details": {
                "title": "",
                "instructor": "Mike",
                "introduction": "",
                "learn": "Lets do this",
                "topics": "foo, bar, yes",
                "prerequisites": "basic golang skills",
                "goal": "To Make you Amazing",
                "additionalDetails": "",
                "highLevelOverview": ""
            }
        },
        {
            "ObjectId": "64953ac1bf06bfdd7936cad8",
            "id": "",
            "title": "Python 算法rithms",
            "description": "An awesome Python course",
            "lessons": "5",
            "duration": "7 hours",
            "course_details": {
                "title": "",
                "instructor": "Mike",
                "introduction": "",
                "learn": "Lets do this",
                "topics": "foo, bar",
                "prerequisites": "basic",
                "goal": "It will Make you Amazing at Python",
                "additionalDetails": "",
                "highLevelOverview": ""
            }
        },
        }
    ],
    "metadata": "none"
}

我希望保留将响应映射到方法中的ts对象的逻辑.

这样做的正确方法是什么?

-更新1-

我现在有了

export default interface ResponseData<T = any> {
    data: T;
}

Axios呼叫

export const api = {

    async getAllCourses(): Promise<Course[]> {

        const res = await request.get<ResponseData<Course[]>>("/v1/courses");

        return res.data.data

    },

}

组件

<script setup lang="ts">
import { api } from "../lib/api";

import Course from "../组件s/courses/Course.vue";
import Filter from "../组件s/courses/Filter.vue";
import ResponseData from "../lib/models/ResponseData";

const courses = await api.getAllCourses()

</script>

没有错误,也没有呈现任何内容:(

I did see however the array in the Axios呼叫 when I console.log(res.data)

enter image description here

-更新2

我让它工作了,但有时它不能渲染.我刷新了它几次,然后有时它会渲染.

let courses = api.getAllCourses().then((res: Course[]) => {

    results = res

    return results
})

阿西奥斯

async getAllCourses(): Promise<Course[]> {
    const res = await request.get<Course[]>("/v1/courses");

    console.log(res.data)

    return res.data

},

-

<div class="grid grid-cols-2 h-4 md:w-4/5 p-4">
    <div class="md:grid-cols-2 lg:grid-cols-1 col-gap-2 md:col-gap-8 md:row-gap-10" v-for='(course, index) in results'>
        <Course :key="index" :course="course"/>
    </div>
</div>

推荐答案

除非您的服务器将返回数据包装到具有data属性的对象中,否则您在request.get()上设置的类型应为Course[]:

const res = await request.get<Course[]>("/v1/courses");

这将把res设置为类型AxiosResponse<Course[]>,其中AxiosResponsedefined as:

export interface AxiosResponse<T = any> {
    data: T
    status: number
    statusText: string
    headers: any
    configL: AxiosRequestConfig
    request: any
}

有了这个,你的getAllCourses()将返回Promise<Course[]>.然后,您可以使用它,而无需任何额外的展开:

const courses = await api.getAllCourses()

如果您的服务器确实将其响应包装在具有data属性的附加对象中,并且您不能更改该属性,则应将ResponseData类型设置为泛型,类似于AxiosResponse:

export default interface ResponseData<T = any> {
    data: T;
}

并相应地在你的getAllCourses()中设置和拆开它:

async getAllCourses(): Promise<Course[]> {
  try{
    const res = await request.get<ResponseData<Course[]>>("/v1/courses");
    return res.data.data // <---- first data from AxiosResponse, second from your server
  ...

这将再次返回Promise<Course[]>,您可以如上所述使用它.


这是一个playground,它复制了你所描述的.

Typescript相关问答推荐

带脉轮UI的TypScript支持StyleProps的正确方法是什么?

映射类型中和映射类型之间的通用变量推断

定义JMX的类型:类型上不存在属性键

React组件数组及其props 的类型定义

无法从应用程序内的库导入组件NX Expo React Native

基于键的值的打字动态类型;种类;

使某些(嵌套)属性成为可选属性

是否存在类型联合的替代方案,其中包括仅在某些替代方案中存在的可选属性?

如果数组使用Reaction-Hook-Form更改,则重新呈现表单

FatalError:Error TS6046:';--模块分辨率';选项的参数必须是:'; node ';,'; node 16';,'; node

使用TypeScrip5强制使用方法参数类型的实验方法修饰符

如何避免从引用<;字符串&>到引用<;字符串|未定义&>;的不安全赋值?

如何静态键入返回数组1到n的函数

TaskListProps[]类型不可分配给TaskListProps类型

接口中可选嵌套属性的类型判断

在REACT查询中获取未定义的isLoading态

有没有一种更好的方法来存储内存中的数据,而不是在类型脚本中使用数组和基于索引的函数?

有没有一种方法可以防止我的组件包在其中安装样式组件'; node 模块中的s目录

如何使用IsEqual创建断言类型相等的实用程序

换行TypeScript';s具有泛型类型的推断数据类型