typescript d.ts文件中如何正确使用namespace 和 interface?

在一个d.ts申明文件中.

  1. 假设有jquery库
declare namespace $ {

}

declare const $;

这两种申明方式是否完全等价? 假如不是,分别应用在什么场景?

  1. 假设一个方法有静态属性,并且静态属性还有二级属性,该怎么表达?
namespace $ {
      namespace fn {
          extend: () => void
      }
}

declare namespace $ {
      let fn: {
          extend: () => void
     }
}


$.fn.extend()

该例子中,使用那种方式更合理呢? 二者的区别在哪里?

  1. 把interface 放在namespace 中仅仅是为了模块化避免命名冲突吗?
declare namespace $ {
     interface Fn {
          extend:() => void
     }
    let fn:Fn;
}

let $2:$.Fn;  // 通过对象的方式来调用

// 单独把interface拿出来模块化起来
// 但是全局多了一个JqueryStatic定义,我又不想暴露这个, 怎么办????
declare namespace JqueryStatic {
   interface Fn {
          extend:() => void
   }
}

// 希望专门放api
declare namespace $ {
   let fn: JqueryStatic.Fn;
   get(ul: string);
}

以上单独模块化了interface Fn, 但是多了一个全局的 JqueryStatic, 该如何处理?

阅读 2.1k
1 个回答

1/2
namespace 是ts 在没有es6 之前提供的一种模块化方案,虽然说很多老的库还有它的存在,但是现在已经不推荐了。

3

declare namespace Root{
   namespace JqueryStatic {
     interface Fn {
            extend:() => void
     }
  }

   namespace $ {
     let fn: JqueryStatic.Fn;
     get(ul: string);
  }

}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题