在自定义类型上使用clarify关键字

时间:2019-11-29 09:38:37

标签: typescript

我对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;
}

1 个答案:

答案 0 :(得分:0)

PromiseResult中的

Categorytypes.d.ts自动添加到全局范围,因为文件顶层没有import / export语句。

或者换句话说,它们成为全局类型声明,因为文件不是模块。而且您不必手动import全局声明,因为它们是隐式已知的(例如TS lib类型)。为了说明这一点,请在export {}中添加src/types/types.d.ts使其成为一个模块-现在将为findAllCategories触发一个错误。

关于declare:您可以仅保留该关键字。 type始终是环境声明,因此有点多余。