0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Gtk3アプリ RiderとTypeScriptとGtk3アプリの連携 その1

Last updated at Posted at 2021-12-06

前提条件
Node.jsのインストール

実行環境を整える

RiderにTypeScriptプラグインをインストール

Screenshot from 2021-12-06 16-23-02.png Screenshot from 2021-12-06 16-19-01.png

拡張子TSから実行できるようにする

まずはpacakge.jsonを作成する

エクスプローラーからpacakge.jsonを作成します。
Screenshot from 2021-12-18 15-45-38.png

pacakge.jsonのある同じ階層フォルダ内で実行します。

# Dev環境のみ
npm install --save-dev ts-node typescript

# 本番環境
npm install --save-dev ts-node

ts-nodeをインストールするとpacakge.jsonに記述されます。
node_modulesフォルダがその場に作成され、その中にts-nodeモジュールがインストールされます。

{
  "name": "ConsoleApp0",
  "version": "1.0.0",
  "dependencies": {
    "ts-node": "^10.4.0",
    "typescript": "^4.5.4"
  }
}

RiderのTypeScriptプラグインのts-nodeのパス欄にも記入します。
Screenshot from 2021-12-18 20-12-02.png

ts-nodeをインストールすることでJs自動でコンパイルしてくれます。そのあとJSを実行してくれます
tsから実行できるようになります

/usr/local/bin/node --require ts-node/register /test.ts

tsconfig.jsonのテンプレートをコピーして使う

tsconfigのテンプレートがありコピーして使えます。

npx tsc --init --rootDir src --outDir lib --esModuleInterop --resolveJsonModule --lib es6,dom --module commonjs

TSconfigの設定

詳しくはここで

"baseUrl": "./",
"strict": true,
"include": []
"exlude" :[]

tsファイルからJSファイルを生成する

TSファイルをビルドしてJsファイルを生成します

npx tsc ./index.ts

TypeScriptを学ぶ

C#風に書くことを心がける

Class

export class clsTest {
    private _name: string;    
    public constructor(name: string) {
        this._name = name;
    }
    public profile(): string {
        return this._name;
    }
}

Async Await

export class Foo {
    private async bar1() {
       var a = await this.wait();
       console.log(a);
    }
    public static async bar2() {
       var a = await wait();
       console.log(a);
    }
}

async function main() {
    const val = await Foo.bar2();
}

main();

パーシャルクラスのAsync Await

import {clsTest} from './clsTest';
declare module './clsTest' {
    interface clsTest {
        _goToLunch(): void;      
    }
}

clsTest.prototype._goToLunch = async function(){   
    const val = await Foo.bar2();
}

awaitがうまく動作しない場合はtargetをes2017以降にします。
Riderのエラーメッセージを参考にしてください

Model

export class testModel {
    test_id: number = 0;
    name : string = "";
    counter1 : number = 0;
}
var testModel1 : testModel = new testModel();

Singleton

export class SingletonClass
{
    private static _instance: SingletonClass;   
    static getInstance(): SingletonClass {
        if (!SingletonClass._instance) {
            SingletonClass._instance = new SingletonClass();
        }
        return SingletonClass._instance
    }
    private constructor() { 
    } 
}

Enum

enum Card {
    Clubs = "clubs",
    Diamonds = "diamonds",
    Hearts = "hearts",
    Spades = "spades",
}
console.log(Card.Diamonds); // diamonds
enum Card2 {
    Clubs, // 0
    Diamonds, // 1
    Hearts, // 2
    Spades, // 3
}
const card : Card2 = Card2.Hearts;
console.log(card); // 2

Staticメソッド Static変数

export class clsTest {
    public static static_name = "";
    public static _getTest() : string{
        return clsTest.static_name;
    }  
}

パーシャルクラス

partialClassTest.ts
export class partialClassTest {
    doWork () : void {
        
    }
}
import "./partialClassTest-1";
partialClassTest-1.ts
import {partialClassTest} from './partialClassTest';
declare module './partialClassTest' {
    interface partialClassTest {
        _goToLunch(): void;
    }
}

partialClassTest.prototype._goToLunch = function(){    
    console.log("aaaaaa");
}
var v : partialClassTest = new partialClassTest();
v._goToLunch();

OverRide

export class clsSub {
    get name(): string {
        return this._name;
    }
    set name(value: string) {
        this._name = value;
    }
    private _name: string;
    constructor(name: string) {
        this._name = name;
    }
    public profile(): string {
        return this._name;
    }
}
export class clsTest extends clsSub { 
    constructor(name: string) {
        super(name);        
    }
    public profile(): string {
        this.name = super.profile();
        return this.name;
    } 
}

Getter Setter

export class clsTest {    
    get name(): string {
        return this._name;
    }
    set name(value: string) {
        this._name = value;
    }
    private _name: string;
    constructor(name: string) {
        this._name = name;
    }
}

RiderにはGeneratorツールがありGetterSetterを作成してくれる
Screenshot from 2021-12-06 16-01-54.png

拡張メソッド

ビルドインしたクラスオブジェクトにメソッドを拡張できます

interface String {
    _add(str: string): string;    
}
String.prototype._add = function (str: string) {
    return "1111111"; 
};

拡張メソッドをts-nodeで有効にする

ts-nodeでコンパイル実行する際にエラーになることがあります。
ts-configに"ts-node"を追加し、transpileOnlytrueにするとエラーがなくなります。

詳しくはts-nodeサイトで

{
  "ts-node": {
    // It is faster to skip typechecking.
    // Remove if you want ts-node to do typechecking.
    "transpileOnly": true,
    "files": true,
    "compilerOptions": {
      // compilerOptions specified here will override those declared below,
      // but *only* in ts-node.  Useful if you want ts-node and tsc to use
      // different options with a single tsconfig.json.
    }
  },
  "compilerOptions": {
  }
}

全モジュール共通 ts-nodeや開発環境を整える工夫

includeを使うことで、import文を自動で挿入できる。

includeでimport文を読み込みたいディレクトリを設定します。
インテリセンスが効くようになる
モジュールを読み込むにはImport文になります。

 "include": [
     "./**/*", //現在の位置
     "/commonClasses/**/*",
     "/extension/**/*",    
 ],

baseUrlを使うことでimport文から相対パスが使えるようになる

../../
./
など

moduleResolutionやtypeRootsもやっておくとよい

"baseUrl": "./",
"moduleResolution": "node",       
"typeRoots": [
   ".",
   "node_modules/@types"
],

クラス(モジュール)はimportを使って読み込む

クラスやモジュールはimportで読み込みます。
importでないとコンパイルが通りません。includeではないです。
Riderには自動でImport文を生成してくれる機能がある。

import文にも種類があり、オブジェクトを宣言していないもの(拡張メソッド)を呼ぶ時は書き方が違う
拡張子tsはつけない

import '../../../commonclasses/extension/clsString'
import {clsTest} from "./class";

拡張メソッドをts-noddeで実行する時はts-configに"ts-node"を追加してやる

transpileOnlyをtrueにしないとエラーになる

{
  "ts-node": {
    // It is faster to skip typechecking.
    // Remove if you want ts-node to do typechecking.
    "transpileOnly": true,
    "compilerOptions": {
      // compilerOptions specified here will override those declared below,
      // but *only* in ts-node.  Useful if you want ts-node and tsc to use
      // different options with a single tsconfig.json.
    }
  },
  "compilerOptions": {
  }
}

import文の中にimport文を書く

importの中で絶対パスならimportできる。
importのまとめたものが作れる

improtTs.ts
import '絶対パス/test1'
import '絶対パス/test2'
import '絶対パス/test3'

Riderのimport補完機能を使う

アイコンをクリックすることで相対パスのImportが補完できる

Screenshot from 2021-12-18 22-40-24.png

tsConfigの詳しい説明はここで

ポイント

tsconfig.jsonを作成する
pacakge.jsonを作成してからパッケージをインストールする。
typescrptとts-nodeパッケージをインストールする。
npm install --save-dev typescript ts-node
pacakge.jsonと同じフォルダで実行する。
includeにパスを記入する。カレントパスと自分のオリジナルライブラリのパス 再帰的にしておく
includeにパスを記入するとimport文が自動で生成されるようになる
typeRootsも記入しておく。インテリセンスが効くようになる。
tsconfig.jsonにts-noddeを追加する。transpileOnlyをtrueにする

Gtk3アプリ GtkNoteBookを使うに続く

0
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?