在ts
中直接使用jQuery
,是会报错的,一般情况是直接安装一个已写好的jQuery.d.ts
文件
不过这次是自己学习写一下jQuery.d.ts
文件。
$(function(){ alert(1111) }) // $ 会报错
$(function(){ $("body").html("<div>123</div>") }) //内部 $ 也会报错
定义全局变量$
.d.ts
文件中定义$
:
- 定义一个全局变量
$
-
$
类型是函数,返回是空 -
$
函数接收一个参数readFunc
,返回空 -
readFunc
类型函数,返回是空
declare var $: (readFunc: () => void) => void;
定义全局函数$
.d.ts
文件中定义$
:
- 定义一个全局函数
$
-
$
函数接收一个参数readFunc
,返回空 -
readFunc
类型是函数,返回是空
declare function $(readFunc: () => void): void;
先在$
只可以接收函数作为参数,但现在$
需要接收一个选择器作为参数,怎么弄呢?
利用函数重载声明$
.d.ts
文件中定义$
:
- 利用函数重载再次声明一个全局函数
$
-
$
函数接收一个参数selector
,返回一个对象,对象中要包含html
的方法 -
selector
类型是string
;html
类型是函数 -
html
函数接收一个html
参数,返回空 - 参数
html
类型是string
declare function $(
selector: string
): {
html: (html: string) => void;
};
用interface
优化代码
html
函数应该返回的是自身,这样在后面使用链式调用
interface jQueryInstance {
html: (html: string) => jQueryInstance;
}
declare function $(selector: string): jQueryInstance;
用interface
重构代码
.d.ts
文件中定义$
:
- 用
interface
声明一个接口jQuery
- 用接口的语法实现两个函数的重载,意思是接口
jQuery
拥有两种方法的实现方式 - 定义一个全局变量
$
, - 它的类型是
jQuery
interface jQuery {
(readFunc: () => void): void;
(selector: string): jQueryInstance;
}
declare var $: jQuery;
对对象进行类型定义
上面实现了$
的函数调用,那如何实现对象调用呢?
$(function(){
$("body").html("<div>123</div>")
new $.fn.init() // fn 会报错
})
$.fn.init()
是一个对象形式的调用,需要使用命名空间。
.d.ts
文件中定义$
:
- 定义命名空间
$
-
$
是一个对象,有一个fn
的对象 -
fn
类型是命名空间,有一个init
方法 -
init
是一个构造方法
declare namespace $ {
namespace fn {
class init {}
}
}
Tip
:当既要$
是函数,又要$
是对象时,用namespace
;如果只是函数调用可以用interface
。
模块化的描述文件
用import
导入jQuery
时,提示在module
下找不到jQuery
。
在.d.ts
文件中定义module
- 定义模块
jquery
- 将之前定义的全局变量都放在
module
中 - 放在
module
中的声明不需要使用用declare
- 导出变量
$
,供外部使用
declare module "jquery" {
interface jQueryInstance {
html: (html: string) => jQueryInstance;
}
namespace $ {
namespace fn {
class init {}
function init(): void;
}
}
function $(readFunc: () => void): void;
function $(selector: string): { html: (html: string) => jQueryInstance };
export = $
}
另外可添加微信ttxbg180218
交流
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。