主頁 > 企業開發 > TypeScript—型別定義檔案(*.d.ts)

TypeScript—型別定義檔案(*.d.ts)

2020-12-08 08:35:15 企業開發

一、ts檔案中引入jquery,
1.大家是否有再vue 上使用過 ts,并再 .ts檔案中參考過 jquery

1.1是不是遇到過如下問題:

import $ from 'jquery';
/***
Could not find a declaration file for module 'jquery'. 'd:/node-common/node_modules/jquery/dist/jquery.js' implicitly has an 'any' type.
  Try `npm install @types/jquery` if it exists or add a new declaration (.d.ts) file containing `declare module 'jquery';`
/
2.上述提示:

2.1.找不到模塊“jquery”的宣告檔案

2.2.嘗試npm install @types/jquery (如果存在的話)

2.3.添加一個包含declare module 'jquery'; 的宣告(.d.ts)檔案

3.嘗試安裝 npm install @types/jquery 檔案

執行后,發現npm倉庫下是有這個包的,而且不需要參考該包,且專案能夠正常運行了,是不是很神奇,

其實這里可以理解為,ts檔案并不知道jquery檔案到底暴露出的什么東西,無法獲取,.d.ts 會把jquery 檔案里面的方法屬性重新定義為它能夠認識的型別,

比如說常用到的$.ajax;$.get,在node_modules/types/jquery/JqueryStatic.d.ts 中我們可以看到對其的定義

interface JQueryStatic {
    ajax(settings?JQuery.AjaxSettings):Jquery.jqXHR;
    get(url: string,
        data: JQuery.PlainObject | string,
        success: JQuery.jqXHR.DoneCallback | null,
        dataType?: string): JQuery.jqXHR;
}

說到這里你可能還不太懂 .d.ts檔案怎么去用,

那么接下來和大家一起分享如何在自己的專案中使用.d.ts檔案,(如2.3中所說,也可以自己創建.d.ts檔案,對jquery 進行定義),

二、了解下TS資料型別
簡單的資料型別:

number:包括數字,浮點數,以及NAN、+-Infinity

string:字串型別

boolean:布爾型別

null,undefined型別

void型別:可以用于表示沒有回傳值的函式

物件型別
type ballType = {
    color:string;
    r:number;
}
let ball : ballType = {color:'red',r:10}

interface ball2Type{
    color:string;
    r:number;
}

let ball2:ballType = {color:'red',r:0.5}

/***
interface 和 type都可以去定義型別,具體也是有區別 如interface 只能定義function、object、class型別,type 不僅可以定義此型別,還可以定義其它型別 type msg = string; 具體差異可自行查閱資料 
*/

//順帶著說一下 可選屬性

interface ball3Type {
    color:string;
    r:number;
    index?:number // ? 把該屬性設為可選屬性,即該屬性可有可無
}
let ball3:ball3type = {color:'red',r:10} //正確
let ball4:ball3type = {color:'red'} //錯誤,ball3Type 需要有r屬性
let ball5:ball3type = {color:'red',r:10,index:1} //正確

//Partial<T> 實作可選屬性
//先看一下Partial 型別的定義
type Partial<T> = {
    [P in keyof T]?: T[P];
};
let ball6:Partial<ball3Type> = {}//正確
let ball7:Partial<ball3Type> = {r:10} //正確
//實際上 Partial 轉化 ball3Type 后,其型別就變成了,每個屬性都是可選屬性,如下
type Patial_ball3Type = {
    color?:string | undefined; // | 如 js 里面的 ‘||’ 或的意思
    r?:number | undefined;
    index?number | undefined;
}

//型別的拓展屬性
let ball8:ball3Type = {color:'red',r:10,title:'ball'} //error ,title 屬性不屬于ball3Type,所以呢,怎么處理這種方式呢,如下:

type ball4Type = {
    color:string;
    r:number;
    index?number;
    [key:string]:string|number; // 表示,可含有string型別的key,且值為stirng或number型別,
}
let ball9:ball4Type = {color:'red',r:10,title:'ball',x:10,y:10} //正確

函式型別
//宣告函式型別
type funType = (name:string) = >void;
let fun:funType = (name)=>{ console.log(name) }
//多型
interface fun2Type = {
    set(name:string):void;
    get(x:number):number;
}
let fun2:fun2Type = {
    set(name){},
    get(x){
        return x;
    }
}

還有一些混合型別,型別的并集,聯合,結構子型別等,

//簡單列舉下型別的并集和聯合
type A = {
    x:number;
    y:number;
}
type B = {
    z:number;
    x:number;
}
let m : A&B = {x:1,y;1,z:1}
let z:A|B = {z:1,x:1}
泛型
//泛型很重要,大家可以查閱資料細看,這里簡單列舉一下
//函式泛型
function get1<T>(num:T[]):T{
    return num[0]
}
//介面泛型
interface gen2Type<T>{
   getColor(ball:T):string;
   saveBall(ball:T):void;
}
//類的泛型
class gen3<T>{
    info(i:T):T{
        return i;
    }
}
三、類
//定義一個類
class A{
    //靜態成員
    static classId:number;
    //成員變數,默認為public 公有屬性
    name:string;
    age:number|void;
    s?:string;
    //建構式
    constructor(name:string,age?:number);
    //方法
    setS(s:string){
        this.s = s;
    }
}

//通過 new 實體化一個物件
const stu = new A('zhangsan');
const stu1 = new A('lisi',18);
stu1.setS("hello");
A.classId = 123;
console.log(`A.classId=${A.classId}`)

//類的繼承
class A {
    name:string;
    constructor(name:string){
        this.name = name;
    }
}
class B extends A {
    age:number;
    constructor(name:string,age:number){
        super(name);
        this.age = age;
    }
}
console.log(new B("zhangsan",18));
// B {name:'zhangsan',age:18}

//介面
interface Ani{
    kinds:number;
    draw(name:string):void;
    getKinds():number;
}
interface Bni extends Ani{
    time:Date;
    setTime(time:Date):void;
}

//當作變數型別
const M:Bni = {
    kinds:1,
    time:new Date(),
    draw(name:string){},
    getKinds(){
        return this.kinds;
    },
    setTime(time:Date){}
}
//當作介面
class M implements Bni {
    kinds = 1;
    time = new Date();
    draw(name:string){}
    getKinds(){
        return this.kinds;
    }
    setTime(time:Date){}
}
四、動手撰寫.d.ts檔案,讓ts檔案識別js

新建index.js檔案

module.exports = {
    url:'https://www.cnblogs.com/zcookies/'
}

新建custom.d.ts

//定義模塊
declare module '*/index.js'{
    const content: {
        url:string
    };
    export = content;
}

入口檔案main.ts

import config from './index.js';
console.log(config.url);
//此時發現引入index.js 不會報錯,而且會智能提示 config下面的url 屬性;

/***
1.如果沒有custom.d.ts
代碼會拋出:Could not find a declaration file for module './index.js';
且沒有智能提示;
2.如果宣告 declare module '*.js',這樣做可以解決掉錯誤提示,但是沒有智能提示;
3.想要正確的智能提示,需要按照js檔案,輸入對應的.d.ts檔案即可,
*/

大家可以利用上面的知識點,實作對更復雜的js檔案進行宣告.d.ts檔案;

轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/231403.html

標籤:JavaScript

上一篇:使用 webpack 手動搭建 vue 專案

下一篇:事件類

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • IEEE1588PTP在數字化變電站時鐘同步方面的應用

    IEEE1588ptp在數字化變電站時鐘同步方面的應用 京準電子科技官微——ahjzsz 一、電力系統時間同步基本概況 隨著對IEC 61850標準研究的不斷深入,國內外學者提出基于IEC61850通信標準體系建設數字化變電站的發展思路。數字化變電站與常規變電站的顯著區別在于程序層傳統的電流/電壓互 ......

    uj5u.com 2020-09-10 03:51:52 more
  • HTTP request smuggling CL.TE

    CL.TE 簡介 前端通過Content-Length處理請求,通過反向代理或者負載均衡將請求轉發到后端,后端Transfer-Encoding優先級較高,以TE處理請求造成安全問題。 檢測 發送如下資料包 POST / HTTP/1.1 Host: ac391f7e1e9af821806e890 ......

    uj5u.com 2020-09-10 03:52:11 more
  • 網路滲透資料大全單——漏洞庫篇

    網路滲透資料大全單——漏洞庫篇漏洞庫 NVD ——美國國家漏洞庫 →http://nvd.nist.gov/。 CERT ——美國國家應急回應中心 →https://www.us-cert.gov/ OSVDB ——開源漏洞庫 →http://osvdb.org Bugtraq ——賽門鐵克 →ht ......

    uj5u.com 2020-09-10 03:52:15 more
  • 京準講述NTP時鐘服務器應用及原理

    京準講述NTP時鐘服務器應用及原理京準講述NTP時鐘服務器應用及原理 安徽京準電子科技官微——ahjzsz 北斗授時原理 授時是指接識訓通過某種方式獲得本地時間與北斗標準時間的鐘差,然后調整本地時鐘使時差控制在一定的精度范圍內。 衛星導航系統通常由三部分組成:導航授時衛星、地面檢測校正維護系統和用戶 ......

    uj5u.com 2020-09-10 03:52:25 more
  • 利用北斗衛星系統設計NTP網路時間服務器

    利用北斗衛星系統設計NTP網路時間服務器 利用北斗衛星系統設計NTP網路時間服務器 安徽京準電子科技官微——ahjzsz 概述 NTP網路時間服務器是一款支持NTP和SNTP網路時間同步協議,高精度、大容量、高品質的高科技時鐘產品。 NTP網路時間服務器設備采用冗余架構設計,高精度時鐘直接來源于北斗 ......

    uj5u.com 2020-09-10 03:52:35 more
  • 詳細解讀電力系統各種對時方式

    詳細解讀電力系統各種對時方式 詳細解讀電力系統各種對時方式 安徽京準電子科技官微——ahjzsz,更多資料請添加VX 衛星同步時鐘是我京準公司開發研制的應用衛星授時時技術的標準時間顯示和發送的裝置,該裝置以M國全球定位系統(GLOBAL POSITIONING SYSTEM,縮寫為GPS)或者我國北 ......

    uj5u.com 2020-09-10 03:52:45 more
  • 如何保證外包團隊接入企業內網安全

    不管企業規模的大小,只要企業想省錢,那么企業的某些服務就一定會采用外包的形式,然而看似美好又經濟的策略,其實也有不好的一面。下面我通過安全的角度來聊聊使用外包團的安全隱患問題。 先看看什么服務會使用外包的,最常見的就是話務/客服這種需要大量重復性、無技術性的服務,或者是一些銷售外包、特殊的職能外包等 ......

    uj5u.com 2020-09-10 03:52:57 more
  • PHP漏洞之【整型數字型SQL注入】

    0x01 什么是SQL注入 SQL是一種注入攻擊,通過前端帶入后端資料庫進行惡意的SQL陳述句查詢。 0x02 SQL整型注入原理 SQL注入一般發生在動態網站URL地址里,當然也會發生在其它地發,如登錄框等等也會存在注入,只要是和資料庫打交道的地方都有可能存在。 如這里http://192.168. ......

    uj5u.com 2020-09-10 03:55:40 more
  • [GXYCTF2019]禁止套娃

    git泄露獲取原始碼 使用GET傳參,引數為exp 經過三層過濾執行 第一層過濾偽協議,第二層過濾帶引數的函式,第三層過濾一些函式 preg_replace('/[a-z,_]+\((?R)?\)/', NULL, $_GET['exp'] (?R)參考當前正則運算式,相當于匹配函式里的引數 因此傳遞 ......

    uj5u.com 2020-09-10 03:56:07 more
  • 等保2.0實施流程

    流程 結論 ......

    uj5u.com 2020-09-10 03:56:16 more
最新发布
  • 使用Django Rest framework搭建Blog

    在前面的Blog例子中我們使用的是GraphQL, 雖然GraphQL的使用處于上升趨勢,但是Rest API還是使用的更廣泛一些. 所以還是決定回到傳統的rest api framework上來, Django rest framework的官網上給了一個很好用的QuickStart, 我參考Qu ......

    uj5u.com 2023-04-20 08:17:54 more
  • 記錄-new Date() 我忍你很久了!

    這里給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 大家平時在開發的時候有沒被new Date()折磨過?就是它的諸多怪異的設定讓你每每用的時候,都可能不小心踩坑。造成程式意外出錯,卻一下子找不到問題出處,那叫一個煩透了…… 下面,我就列舉它的“四宗罪”及應用思考 可惡的四宗罪 1. Sa ......

    uj5u.com 2023-04-20 08:17:47 more
  • 使用Vue.js實作文字跑馬燈效果

    實作文字跑馬燈效果,首先用到 substring()截取 和 setInterval計時器 clearInterval()清除計時器 效果如下: 實作代碼如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta ......

    uj5u.com 2023-04-20 08:12:31 more
  • JavaScript 運算子

    JavaScript 運算子/運算子 在 JavaScript 中,有一些運算子可以使代碼更簡潔、易讀和高效。以下是一些常見的運算子: 1、可選鏈運算子(optional chaining operator) ?.是可選鏈運算子(optional chaining operator)。?. 可選鏈操 ......

    uj5u.com 2023-04-20 08:02:25 more
  • CSS—相對單位rem

    一、概述 rem是一個相對長度單位,它的單位長度取決于根標簽html的字體尺寸。rem即root em的意思,中文翻譯為根em。瀏覽器的文本尺寸一般默認為16px,即默認情況下: 1rem = 16px rem布局原理:根據CSS媒體查詢功能,更改根標簽的字體尺寸,實作rem單位隨螢屏尺寸的變化,如 ......

    uj5u.com 2023-04-20 08:02:21 more
  • 我的第一個NPM包:panghu-planebattle-esm(胖虎飛機大戰)使用說明

    好家伙,我的包終于開發完啦 歡迎使用胖虎的飛機大戰包!! 為你的主頁添加色彩 這是一個有趣的網頁小游戲包,使用canvas和js開發 使用ES6模塊化開發 效果圖如下: (覺得圖片太sb的可以自己改) 代碼已開源!! Git: https://gitee.com/tang-and-han-dynas ......

    uj5u.com 2023-04-20 08:01:50 more
  • 如何在 vue3 中使用 jsx/tsx?

    我們都知道,通常情況下我們使用 vue 大多都是用的 SFC(Signle File Component)單檔案組件模式,即一個組件就是一個檔案,但其實 Vue 也是支持使用 JSX 來撰寫組件的。這里不討論 SFC 和 JSX 的好壞,這個仁者見仁智者見智。本篇文章旨在帶領大家快速了解和使用 Vu ......

    uj5u.com 2023-04-20 08:01:37 more
  • 【Vue2.x原始碼系列06】計算屬性computed原理

    本章目標:計算屬性是如何實作的?計算屬性快取原理以及洋蔥模型的應用?在初始化Vue實體時,我們會給每個計算屬性都創建一個對應watcher,我們稱之為計算屬性watcher ......

    uj5u.com 2023-04-20 08:01:31 more
  • http1.1與http2.0

    一、http是什么 通俗來講,http就是計算機通過網路進行通信的規則,是一個基于請求與回應,無狀態的,應用層協議。常用于TCP/IP協議傳輸資料。目前任何終端之間任何一種通信方式都必須按Http協議進行,否則無法連接。tcp(三次握手,四次揮手)。 請求與回應:客戶端請求、服務端回應資料。 無狀態 ......

    uj5u.com 2023-04-20 08:01:10 more
  • http1.1與http2.0

    一、http是什么 通俗來講,http就是計算機通過網路進行通信的規則,是一個基于請求與回應,無狀態的,應用層協議。常用于TCP/IP協議傳輸資料。目前任何終端之間任何一種通信方式都必須按Http協議進行,否則無法連接。tcp(三次握手,四次揮手)。 請求與回應:客戶端請求、服務端回應資料。 無狀態 ......

    uj5u.com 2023-04-20 08:00:32 more