Typescript Javascript TypingsDefinition

最近在使用dbus-native來讓後端service可以接收DBUS訊號以及發出訊號至DBUS

因為使用typscript開發習慣了(想當初寫JS才發現有強型別的定義真的..差很多),所以一開始就在找這隻檔案的定義檔有沒有放到@types的倉庫

OK...沒有

這個意思就是說,假若說我想要使用DBUS的話我必須要自行去定義,或者...乾脆直接硬幹

硬幹的話大概就是加入以下的東西就可以使用

import dbus = require("dbus-native");

可是這樣就是沒有定義檔的提示可以使用

對於已經被TS養大胃口的我來說就很不方便...

(另外一提,在javascript也是有IDE做提示function使用,不過Linux沒辦法使用visual studio,eclipse 吃資源,Webstorm沒錢 QQ)

對於這種IntelliSense,可以使用以下的方法添加最基本的支持(不過這對我目前的專案支援度超低...)

在require dbus的package後,我們是會從index.js開始對整支程式存取及使用,網路上有人做出對於該項package轉definition的工具,可惜...沒用,以下是這支程式的一部分程式碼

module.exports = createConnection;

module.exports.createClient = function(params) {
  var connection = createConnection(params || {});
  return new MessageBus(connectionparams || {});
};

module.exports.systemBus = function() {
  return module.exports.createClient({
    socket: '/var/run/dbus/system_bus_socket'
  });
};

module.exports.sessionBus = function(opts) {
  return module.exports.createClient(opts);
};

module.exports.messageType = constants.messageType;
module.exports.createConnection = module.exports;

我需要的是強型別的東西,這種轉換出來型別設定只會出現一堆的any

對於我之後設計其實蠻不好用的

所以就開始了漫長的CLASS定義之路

declare module "dbus-native"{
}

這是先對這整支程式做模組定義

然後再一步一步做下去

    import * as net from "net";
    import * as events from "events";

在模組中先宣告會用的一些dependency,就在模組中定義起來

interface msg {
    destination?: string;
    path?: string;
    'interface'?: any;
    memberstring;
    signature?: any;
    body?: Array<any>;
}

這是宣告資料型態,一般來說單純傳輸用的data我會額外進行定義做成interface提示我傳出來的資料會長得如何

interface MessageBus {
    connectionany;
    serialnumber;
    cookiesObject;
    listNames(callback?:(err,res)=>void);
    listActivatableNames(callback?:(err,res)=>void);
    updateActivationEnvironment(env:any,callback?:(err,res)=>void);
    startServiceByName(name:any,flags:any,callback?:(err,res)=>void);
    getConnectionUnixUser(name:any,callback?:(err,res)=>void);
    :
    :
}

主戲登場,老實說太長了我擷取一小段就好,基本上會出現Obj是我已經懶得再TRACE下去了...callback function的宣告方式在定義檔中採用的是es6的arrow function

enum flags {
    noReplyExpected = 1,
    noAutoStart
}

Typescript支援使用enum其實用法跟const差不多,就是當作狀態列表來做檢視

可以從第一個 =1 看出他的第一位設定從幾開始

const messageType : {
    error:number,
    invalid:number,
    methodCall:number,
    methodReturn:number,
    signal:number,
}

這邊是跟enum去做區分  這邊是lib內原本就已經做好了相關的設定,不好再把它區分出來寫成enum

function createClient(options?: StreamOptions): MessageBus;
function createConnection(opts?: StreamOptions): CreateConnection;
function systemBus(): MessageBus;
function sessionBus(options?: StreamOptions): MessageBus;
function createServer(): Server;

最後的部分,為了跟上頭(module.export)去做一個呼應,把它的定義根據前面的子型別的部分做出來

這是我的definition files 如果有興趣的話可以看一下

這是我所對其定義的專案

之後大概有可能應該的line-bot專案應該會做一個簡易的介紹吧...((都還沒完成X

清一下草稿的庫存  看一下之後還可以介紹啥...

留言

這個網誌中的熱門文章

ts-node 應用

nodejs async await promise

Editor 比較~