意外と知られていないTypeScriptのTips

## これはなに？
最近、きちんとTypeScriptを学ぼうと思いTypeScriptのオライリー本を購入しました。
まだ途中までしか読んでいませんが、すでに知らないことがたくさんあったので知識の定着がてらその中からいくつか書いてみようと思います。

## 明示的？ or 推論？
>一般に、明示的に型付けされたコードの使用を最小限に抑え、プログラマーの代わりにTypeScriptにできるだけ多くの方を推論させるのは、良いスタイルと言えます。
出典：プログラミングTypeScript ―スケールするJavaScriptアプリケーション開発 2章 TypeScript:全体像

まず読み始めて驚いたのがこちらです。

結論としては、型を明示的に書くよりもTypeScriptに型推論を任せたほうが良いコードとのことでした。

驚いたというのも自分の前提知識が少し間違っていたからで、
**そもそもTypeScriptは自分で型をきちんと書けるから明示的ではない=暗黙的にanyか何かになる**
と思っていたからです。

そうではなく、TypeScript側で型を推論してくれるようのでそちらを頼るようにしていこうと思います。

## オブジェクト型のreadonly
オブジェクト型の一部のプロパティを読み取り専用にすることができるというものです

```ts
let user: {
    readonly myName: string
} = {
    myName: 'mu-suke'
}

console.log('user.myName: ', user.myName) // mu-suke

user.myName = 'hogehoge' // Cannot assign to 'myName' because it is a read-only property.
```

実際に動かしてみましたが、TSCの段階でエラーが吐かれました
[DEMO](https://www.typescriptlang.org/ja/play?#code/DYUwLgBArgziBOAuCBvAUBTF4gIYBMB7AO2AE8IBbMgOV0pGRjHgEtiBzNAXwgF5UGLNToNkAckpQAtDCgBrEOJ5o0AYxIxCoAHTBCHABTjYCHSPqMI4gDTQ48c7UsBKCAHp3VGXMWrTjhYM-NYAFgYg4RxKHl4AwrjExISQuDAwrBzEEGCE1kExAEYgarimEKyQrDAQuNh4+NIk5BAADvCErQhgZDpAA)


## unknown型
続いてはunknown型。
これはanyと同じく、任意の値を表していますが、中身が何の型であるかがわかるまで、値の使用を許さないというものです。

```ts
let a: unknown = 15
let b = a + 5 // Object is of type 'unknown'.

if (typeof a === 'number'){
    let c = a + 15 // OK!
}
```

[DEMO](https://www.typescriptlang.org/ja/play?#code/DYUwLgBAhgXBCuA7A1og9gd0RAvBAjAKwBQokARrtBANQSEQD0jEA8uQFYgDGkAlgGcIaAGYQwATwAOICAHIkqTIjkA6YsT5iAFJJmjqOI-MTwAtuRAAnOQEoA3sQjOIZCNypRaBBszYBpAEJiAF9iIA)


## 【番外編】使用頻度低いけどこんなのあったんだシリーズ
### bigint型
これは型の名前の通り、大きめ(big)の整数(integer)を扱う型になります。

number型が表せる整数が2^53に対して、
bitint型はそれ以上の整数を扱えるというの特徴があります。

自分のプロダクトではこんな大きな数値を扱うことがないのでどこで使われるのか想像ついていません。。。

```ts
const a = 1n
const b = 2n

console.log('a: ', typeof a) // bigint
console.log('a > b: ', a > b) // false
```

[DEMO](https://www.typescriptlang.org/ja/play?target=7#code/MYewdgzgLgBAhjAvDAjGAUKSsBGSYBMGm4EIANgKYB05IA5gBQDkcAXDMwDQxQCeAB0ogAZvACUMAPRSYOAJb15YKCUgUadJqxgA+OR27w9cyTJgi45CJSA)

### symbol型(理解不十分)
オブジェクトやマップのキーで使われることがあり、使用頻度はかなり低い

```ts
let a = Symbol('hoge')
let b: unique symbol = Symbol('hoge') // A variable whose type is a 'unique symbol' type must be 'const'.

var c = a === b

console.log('c: ', c) // false
```
[DEMO](https://www.typescriptlang.org/ja/play?target=7#code/DYUwLgBAhhC8EGUCeBbARge2ACgOQAsMBzEXASgChRI0AuCAVwDsBLARwZAgGdVNg4iPljyES5CAHpJEAIIQAblABOLKGlAQA7oW5cwSAA5cW3aBFzN2nHsOC4IB4xBQNuNLrgDGGJu9wAdBQUSsoQXoIwsNEQaME+flggAcDEeF70uAA04WRSMgBmUMB6QA)


たまたま使用している箇所を教えてもらったのですが、どうやらそのプロパティを上書きをさせたくない場合に用いることがあるようです。
https://github.com/1amageek/ballcap.ts/blob/f02cf237327b12bb821bdaa0e77991b767e830bf/web/src/Field.ts#L4

## まとめ
今思えばそりゃそうだって思う間違いや知らないことにも気づけたので引き続き読んでいきたいと思います。
オライリーの本は堅苦しいイメージがあり読むのを渋っていたのですが、いざ読んでみるとどのサイトの記事よりも丁寧に書いてあるのできちんと学ぶには最適だなと思いました。

ではまた！

## 参考書籍
- [プログラミングTypeScript ―スケールするJavaScriptアプリケーション開発](https://www.amazon.co.jp/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0TypeScript-%E2%80%95%E3%82%B9%E3%82%B1%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8BJavaScript%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E9%96%8B%E7%99%BA-Boris-Cherny/dp/4873119049/ref=sr_1_3?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&keywords=typescript&qid=1637303956&sr=8-3)