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