rest parameter(@TypeScript)

関数に引数を渡す時に、不定長の場合の渡し方で配列を使った場合とrest parameterを使った場合です。

配列の場合はあくまで引数は配列が一個渡されるだけで、呼び出し側も配列で呼び出し。

rest parameterの場合には、呼び出し側は可変長引数を羅列ですから明らかに別物です。

// argument as an array
function sum(numbers: number[]): number{
    return numbers.reduce((total, n) => total + n, 1)       // the return value starts with 1
}

console.log(sum([1, 2, 3, 4, 5])) // 16

// rest parameter (type safe compared to arguments method)
function sumRest(message: string, ...numbers: number[]):[string, number]{
    return [message, numbers.reduce((total, n) => total + n, 1)]
}

let res: [string, number] = sumRest('sum :', 1, 2, 3, 4, 5)
console.log(res[0], res[1] ) // sum : 16

sumRest()の呼び出し時のresの戻り値型指定は不要ですがコメントのようなもの。sumRest()の定義側では戻り値の型指定は必須です。

 

admin

関数呼び出しのデフォルトパラメータ(@TypeScript)

関数のデフォルトパラメータを、以下でContextという形で定義した時に、関数で設定するときは以下のようなやり方。type指定で要素をオプション指定しているので、log関数では指定したい方だけ指定すれば良い。

// default parameter
type Context = {
    appID?: string,
    userID?: string
}

function log(message: string, context: Context = {userID:'aaabID'}){
    let time = new Date().toString()
    console.log(time, message, context.userID)
}

let id: Context = {userID: 'xxxyID'}
log('parameter', id)    // Wed Jun 14 2023 14:43:05 GMT+0900 (日本標準時) parameter xxxyID
log('parameter')        // Wed Jun 14 2023 14:43:05 GMT+0900 (日本標準時) parameter aaabID

TypeScriptというだけあって、型が中心にあるように感じる言語です。

 

admin

VScodeで識別子の定義が重複と言われる(@TypeScript)

VScodeでTypeScriptのコンパイルを行なって、ソースエディター上に.tsと.jsファイルを並べて表示させると、

こんなエラーが表示されます。コンパイルも実行も問題なくできるのですが、

対策はエディタ画面に同時表示させないこと、というだけですけれども。

ディレクトリの構成は、こんな感じです。

tsconfig.jsonは、

npx tsc --init

で作成。

% npx tsc --init

Created a new tsconfig.json with:                                               
                                                                             TS 
  target: es2016
  module: commonjs
  strict: true
  esModuleInterop: true
  skipLibCheck: true
  forceConsistentCasingInFileNames: true


You can learn more at https://aka.ms/tsconfig

 

admin

union & intersection of types(@TypeScript)

ちょっと見紛らわしい、union(論理和)とintersection(論理積)です。

// union & intersection of types
type Cat = {name: string, purrs: boolean}
type Dog = {name:string, barks: boolean}
type CatOrDog = Cat | Dog
type CatAndDog = Cat & Dog

let a_o: CatOrDog = {
    name: 'ball',   // need not to specify all properties
    barks: false
}

let a_a: CatAndDog = {
    name: "Dounald",
    barks: false,   // need to specify all properties of the Dog and Cat
    purrs: false
}

論理和(|)であるa_oはプロパティのいずれかが記述されてればいいけれども、論理積(&)であるa_aはプロパティを全て記述しないとエラーになります。

実際のコードではunionの方が遥かに登場機会が多いようですが、いずれかのプロパティを持てば良いという定義からしてそうなりそうです。

 

admin

{}, object, Objectの違い@TypeScript

TypeScriptはその名の通り、基本的に型を厳密に定義しないといけませんが、タイトルの通り似たような三つのオブジェクト定義が存在します。その性質の違いを見るのが以下のコードです。

// object, Object and {}
let o1: {}
let o2: object
let o3: Object  // Object is an interface

o1 = {a: 2} // object
o1 = 123    // primitive

o2 = {a: 2}
//o2 = 123  // primitive is not usable

o3 = {a: 2}
o3 = 123

o1 = {toString() {return 1}}    // accept any type of object
//o3 = {toString() {return 1}}    // treat o3 as a string type which is a predefined type

・{}, Object : オブジェクトもプリミティブも代入可能

・object : オブジェクトのみ代入可能

実はObjectはインターフェースであると、またTypeScriptではプリミティブ以外は全てオブジェクトです。

オブジェクトの定義方法としては、

オブジェクトとプリミティブの分離のためと思いますが、

let o0: {a: 1}のようなオブジェクトそのものを定義、もしくはobjectを使うのが推奨されています。

 

admin

type unknown@TypeScript

TypeScript読み始めて、型にanyがあるのは例えばGolangの構造体にもanyがあるから、まあそうかなと思いますがunknownというのは目新しい。

以下、unknown type説明用のコードですが、unknownでも限定的な演算子はサポートしていて例えば’===’はサポートされていますが、’+’演算子に対してはまさしくunknown扱いでコンパイルエラー(VScodeなので赤アンダーライン)になります。

typeofで型を特定してやればこの例ではnumberとして扱うことができています。

以下の実行結果で違いがわかります。

// unknown type 
let aa: unknown = 10    // type safe 'any'
let cc = aa === 10      // === is usable
console.log(cc)

//let dd = aa + 20      // -> cause error
if (typeof aa === 'number'){
    let dd = aa + 20
    console.log(dd)
}


// any type
let aaa: any = 10    // type safe 'any'
let ccc = aa === 10
console.log(ccc)

let ddd = aaa + 20
ddd = aaa + 20
console.log(ddd)

<results>

% ts-node "./hello.ts"
true
30
true
30

anyは文字通りどのような型であっても設定できますが、unknownは型の特定(annotation)が必要にされる場合があるところがanyとの違いです。故にunknownはtypesafe anyと呼ばれるようです。

この辺りの仕様は最近の言語仕様だと感じるところです。

P.S. 2023/6/13 unknownの補足

unknownは型の特定が必要ということで、もしunknownの変数を扱う場合には、例えばtypeofで型の絞り込みを行えば、TypeScriptがその型を認識してくれて処理ができます。以下、unknown型をnumber型として絞り込んで処理しています。

// type of unknown
let hh: unknown = 10
if (typeof hh === "number"){
    let hh_m = hh * 3
    console.log(hh_m)
}

 

admin

TypeScriptの概要本

TypeScriptについて一通り知るべき内容が記載されている書籍だろうと思います。

発行が2020年なのでTypeScript 3.0準拠でしょうが、4.0では大きな変更はないとのことなので差分を意識すれば十分使えるでしょう。

 

admin

 

AppleScript

初めて知りましたが、MacでAppleのスクリプト言語(OSA : open scripting architecture対応)を使えばJavaScriptの実行も呼び出せるということ。

例えば、以下のようなhello.jsファイルを実行するには、

let helloWorld = "Hello World";

console.log(helloWorld);

----------------------------------
% osascript -l JavaScript hello.js
Hello World

のように呼び出せます。一番簡単に使えるJavaScriptの実行環境になるかと思います。もちろんDOMなどの呼び出しはできませんが。

osascriptのコマンド使用方法は、

https://support.moonpoint.com/os/os-x/man/man_osascript.html

node.jsがインストールされていれば、その環境で実行するのが一番確実ではありますが。

 

admin

micro:bitのカスタムブロックを作る

以下を参照に一番簡単に作れるであろう、出来合いの拡張ブロックを動かしてみた。

https://qiita.com/tkyko13/items/081b8759ed98f6ed577d

手順はリンクの通りですが、普通にGitHubに上げることもできるので共有(全体になるので、ブロックを部品としては扱えない)もできます。

内部的にはブロックはおそらくStatic TypeScriptに変換され、さらにJavaScript、そしてマシンコードに落とされてhexファイルが作成されて、それをmicro:bitに転送すれば実行されるという流れになります。

Type Script(Java Script)のコードは適当なドキュメントが存在しない(見つけられないだけ)ようなので、ブロックからJavaScriptのコードを拾い出して使うしかなさそう。

 

admin

 

 

 

micro:bitの拡張機のでライントレース時のログを取ってみた

pxt-microbitを調べている間に、すでに拡張機能でmicro:bit内蔵のFlashにログが取れる機能があることを知りました。で画像下の黒ラインをトレースさせた結果のログを取ってみると、

こんな感じで画像化できました。ログデータはmicro:bitディレクトリから見えるMY_DATA.HTMをダウンロードするとcsvファイルなのでnumbersで加工。ログをクリアする処理を処理の初期化で入れてしまうと、ログを取ろうとすると中身が消えてしまうので追記型にしています。

ログの対象はモーター駆動パワーと、ラインセンサーのフォトトランジスタ電圧をAD変換したもの。駆動パワーが130を超えている部分はラインを逸脱しそうになって右回転あるいは左回転を実行している部分です。

グラフ化してみると概ねイメージと合っていますが、データをビジアル化してみるのは理解が早まると思います。

今現在のコードは、

https://github.com/chateight/trace_microbit

P.S. 2023/6/14

フラッシュメモリへのログは予想以上に時間がかかっていて、ループ時間のおよそ30msは大半がログのための時間のようです

 

admin