【发布时间】:2021-03-02 00:04:49
【问题描述】:
我正在尝试用 Vue3、TypeScript 和 Axios 找出一些“类型安全”基础知识。
这是非常简单的东西,我觉得好像我错过了一些明显的东西!
我已经创建了一个Book 接口:
Book.ts
interface Book {
id: string;
userId: string;
title: string;
content: string;
}
export default Book;
我还创建了一个简单的服务来获取一些 JSON,例如
{
"userId": 1,
"id": 1,
"title": "sunt aut facere repellat provident occaecati excepturi optio reprehenderit",
"body": "quia et suscipit\nsuscipit recusandae consequuntur expedita et cum\nreprehenderit molestiae ut ut quas totam\nnostrum rerum est autem sunt rem eveniet architecto"
},
(注意:JSON 有body 而不是接口上定义的content)
DataService.ts
import axios, { AxiosResponse } from "axios";
import Book from "@/interfaces/Book";
class DataService {
async FetchBooks(): Promise<Book[]> {
let response: Book[] = [
{ id: "1", userId: "someone", title: "A title", content: "Some content" }
];
try {
const val = await axios.get<Book[]>(
`https://jsonplaceholder.typicode.com/posts`
);
if (val.data && val.status === 200) {
response = val.data;
}
} catch (error) {
console.log(error);
}
return response;
}
}
export default new DataService();
我的第一个问题是,为什么我的服务响应值在Book 接口上不存在时仍包含“body”?当我将类型 Book 传递给 axios 获取请求时,我希望它会被丢弃。
我的第二个问题是,为什么我可以在下面引用{{ book.body }},而我再次将响应处理为Book 和body 未在界面上定义?
Book.vue
<template>
<div v-for="book in books" :key="book.id">
<div class="mb-2">
{{ book.body }}
</div>
</div>
</template>
<script lang="ts">
import { defineComponent } from "vue";
import DataService from "@/services/DataService";
// eslint-disable-next-line no-unused-vars
import Book from "@/interfaces/Book";
export default defineComponent({
async setup() {
let books: Book[] = [];
await DataService.FetchBooks().then(data => (books = data));
return { books };
}
});
</script>
【问题讨论】:
标签: typescript vue.js axios vuejs3