我对Typescript
定义文件的概念感到困惑。我有一个这样的项目结构:
project/
├── src/
│ ├── models/
│ ├── Category.ts
│ ├── types/
│ ├── types.d.ts
├── tsconfig.json
├── package.json
src / models / Category.ts:
import axios from 'axios';
export class CategoryModel {
async findAllCategories(): Promise<Category[]> {
const data = await axios.get('/localhost:3000/api/categories');
return data;
}
}
所有项目类型都写在types/types.d.ts
文件上。
src / types / types.d.ts:
type PromiseResult<T> = T extends Promise<infer U> ? U : T
type Category = {
id: number;
name: string;
slug: string;
parent: number;
image: string | null;
count: number;
}
代码工作正常,但是CategoryModel
文件如何知道在types.d.ts
上定义了一个自定义类型。
我的意思是没有在types.d.ts
上导入CategoryModel
文件。为什么这一行没有抛出错误?
async findAllCategories(): Promise<Category[]>
如果我没有在自定义类型上写declare
关键字,代码仍然可以正常工作。但是,带有或不带有declare
关键字的区别是什么?
src / types / types.d.ts:
declare type PromiseResult<T> = T extends Promise<infer U> ? U : T
declare type Category = {
id: number;
name: string;
slug: string;
parent: number;
image: string | null;
count: number;
}
答案 0 :(得分:0)
PromiseResult
中的 Category
和types.d.ts
自动添加到全局范围,因为文件顶层没有import
/ export
语句。
或者换句话说,它们成为全局类型声明,因为文件不是模块。而且您不必手动import
全局声明,因为它们是隐式已知的(例如TS lib
类型)。为了说明这一点,请在export {}
中添加src/types/types.d.ts
使其成为一个模块-现在将为findAllCategories
触发一个错误。
关于declare
:您可以仅保留该关键字。 type
始终是环境声明,因此有点多余。