首页 > 解决方案 > 与打字稿语法混淆

问题描述

我是 TS 新手,只是对它的语法有一些疑问,下面是我看到的一些代码:

//type declaration file

declare interface Debug {
    (namespace: string): Debugger
}

declare interface Debugger {
    (...args: string[]): void;
    enabled: boolean;
}

declare var debug: { default: Debug };

export = debug;

下面是 index.ts 文件

import debug from "debug";

let db = debug("Example App");
db.enabled = true;
...

所以我的问题是:

1.interface中的成员是Debug什么,它看起来不像一个方法,因为它没有方法名,而且它肯定不是属性,所以什么是(namespace: string): Debugger

2-debug是一个对象,而不是一个方法,它的类型形状是{ default: Debug },那么我们怎么可以使用debug("Example App"),把它当作一个方法呢?

3-为什么我必须使用export = debug;?我们不能摆脱这个并使用

...
export declare var debug: { default: Debug };
// export = debug;

标签: javascripttypescript

解决方案


1.Debug接口中的成员是什么,它看起来不像一个方法,因为它没有方法名,而且肯定不是属性,那么(namespace: string)是什么:Debugger

Debug 是一个接收字符串并返回调试器的函数。编写相同内容的更传统方法是:

type Debug = (namespace: string) => Debugger

第一个界面实际上并不需要使用这种替代语法,但是您的第二个问题中的界面是有用的界面:

2-debug是一个对象,不是一个方法,它的type shape是{ default: Debug },那我们怎么能用debug("Example App"),把它当成一个方法呢?

它是一个函数。但它也有额外的属性,这是这种表示法的优点。它指出你可以将它作为一个函数调用(它接受一个字符串数组并返回一个 void),或者你可以访问它的.enabled属性。

3-为什么我必须使用export = debug;?我们不能摆脱这个并使用

这会将其更改为命名导出而不是默认导出。这是可行的,但会改变您导入它的方式。


推荐阅读