ふりかえりって楽しい(2020.04.13 ~ 2020.04.19の週報)
今週考えていたこと
- ふりかえり会をやる意味について
- 短期的に達成したいこと
- コミュニケーション不足の解消
- コントローラブルなことに目を向けることでのストレス軽減
- 中期的に達成したいこと
- あんまり考えてなかったかも
- まず短期の目標達成が優先
- 先の計画を立てて行動するのが苦手
- その時の状況、環境などを考慮して決めていけばいいのでは?
- あんまり考えてなかったかも
- 長期的に達成したいこと
- 会社の文化としてふりかえり会が定着している
- 会社の文化って誰が作るの?
- 会社にいる個人の良さがうまくマージ(溶け合って)して出来上がるものというイメージ
- そうした時に考えるべきことは、自分の良さとか自分が得意なこと、好きなことを黙々とやっていくこと。
- 意図して作ろうとすると、しらけた感じになりそう
- 会社の文化って誰が作るの?
- 会社の文化としてふりかえり会が定着している
- 短期的に達成したいこと
フロント
- TypeScriptの型
- Literal型
let clothSize: "small" | "medium" | "large" = "large" const cloth = { color: "white", size: clothSize } cloth.size = "small" // compile error
- typeエイリアス
- void型
- TypeScriptは関数でundefinedを返すことを許していない
- ただし、return文があるときはコンパイルが通る
- TypeScriptは関数でundefinedを返すことを許していない
- unknown型
- anyより少し厳しい制約がある。
- 基本的にanyと同じく代入できるが、代入した値を利用する時には、型を保証する必要がある
let unkniwnInput: unknown let text: string unkniwnInput = "hello" text = unkniwnInput // Type 'unknown' is not assignable to type 'string'. if (typeof unkniwnInput === "string"){ text = unkniwnInput }
- TypeScriptのコンパイラー
- tsconfig.json
- include/exclude
- sorceMap
- ブラウザでTypeScriptをデバッグしたい時に使用する。
- JavaScriptからTypeScriptを生成する際に使用される
- ブラウザでTypeScriptをデバッグしたい時に使用する。
- tsconfig.json
- TypeScriptでClassを使う
- 「this」の範囲
- 範囲というかパターンで理解するのが良さそう
- https://qiita.com/takeharu/items/9935ce476a17d6258e27
- TypeScriptでclassを書くと、classが型になる
- 「this」の範囲
- Interface
- Objectの型
- オブジェクトのみ利用可能 <=> Type
- オブジェクトにはInterface, 変数はTypeを利用する
- Interfaceを満たしているのであれば、問題なし
- 部分的に構造を定義することが可能
- Interfaceで関数の型を定義する
- Objectの型
interface addFunc { (num1: number, num2: number): number; }
- インターセクション
type NumberBoolean = number | boolean type StringNumber = string | number type Mix = NumberBoolean & StringNumber const TEST1 : Mix = "TEST" // TS2322: Type '"TEST"' is not assignable to type 'number'. const TEST2 : Mix = true // TS2322: Type 'true' is not assignable to type 'number'. const TEST3 : Mix = 100
- Type Guard
class Dog { speak() { console.log("bow") } } class Bird { speak(){ console.log("tweet") } fly(){ console.log("fly") } } type Pet = Dog | Bird function havePet(pet: Pet) { if(pet instanceof Bird){ pet.fly() } }
- [https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/instanceof](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/instanceof)
// HTMLElement => HTMLInputElementへの型アサーション const input1 = <HTMLInputElement>document.getElementById("input") const input2 = document.getElementById("input") as HTMLInputElement // jsxを使用している時にはこちらの方が紛らわしくない (document.getElementById("input") as HTMLInputElement).value = "hogehoge"
interface Designer { name: string; age: number; [index: string]: string } // TS2411: Property 'age' of type 'number' is not assignable to string index type 'string'. interface Designer{ name: string; age: srting; [index: string]: string } // ok
- 関数のオーバロード
function toUpperCase(x: string): string; function toUpperCase(x: number): number; function toUpperCase(x: string | number): string | number { if (typeof x === "string"){ return x.toUpperCase() } return x } const hello1 = toUpperCase("hello")// string const hello2 = toUpperCase(20) // number
- Nullish Coalescing
const downLoadData: DownLoadedData = { id: 1 } const userData = downLoadData.user ?? "not-set" // undefined or null の時に「not-set」になる
[https://blog.jxck.io/entries/2019-08-14/nullish-coalescing-optional-chaining.html](https://blog.jxck.io/entries/2019-08-14/nullish-coalescing-optional-chaining.html)
- LookUp型
- objectのメンバー型を取得する方法
interface DownLoadedData { id: number; user: { name?: { first: string; last: string } } } type id = DownLoadedData['id'] // number type user = DownLoadedData['user'] // user
- ジェネリクス
- 型を引数として受け入れる機能
function copy<T>(value:T): T { return value } console.log(copy<string>("ddd").toUpperCase()) class DataBase<T extends string | number | boolean> { private data:T[] = []; add(item: T){ this.data.push(item) } remove(item: T){ this.data.splice(this.data.indexOf(item), 1) } get(){ return this.data } } const database1 = new DataBase<string>() database1.add("string-only") const database2 = new DataBase<number>() database2.add(11) const database3 = new DataBase<boolean>() database3.add(true)
- kyeof
// 柔軟なジェネリクスを作りたい時 function copy<T extends {name: string}, U extends keyof T>(value:T, key: U) { return value[key] } copy({name: "test", age: 20}, "age)
interface Todo { title: string; text: string; } type Todoable = Partial<Todo> // オプショナル型 const todo: Todoable = { title: "s" }
- conditional Types
type ConditionalType1 = "tomato" extends string ? number : boolean // number type ConditionalType2 = string extends "tomato" ? number : boolean // boolean
- nullとundefiend
- https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/null
- null は識別の欠如を表し、変数がオブジェクトを指してないことを示します。API においては、通常はオブジェクトが返されるところで、関連したオブジェクトがない場合に null がよく渡されます。
- https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/undefined
- まだ値が代入されていない変数は undefined 型となります。評価しようとしている変数に値が代入されていない場合、メソッドや文も undefined を返します
- https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/null
バックエンド
- Go
- map
- errors
- errorメッセージを使用するときに「:」を使用すると、見えにくくなる
io.Writer
io.Reader
- 入力の抽象化
- io.Readerの補助関数
- ioutil.ReadAll()
- 終端記号に当たるまで全てのデータを読み込む
- ioutil.ReadFull()
- 決まったバイト数だけ確実に読み込む
- ioutil.ReadAll()
buffer := make([]byte, 4) size, err := io.ReadFull(reader, buffer)
- io.Copy()
- https://golang.org/pkg/io/#Copy
- ファイルなどを読み込んで書き込む(つまりコピー)を行う
- https://golang.org/pkg/io/#Copy
r := strings.NewReader("some io.Reader stream to be read\n") if _, err := io.Copy(os.Stdout, r); err != nil { log.Fatal(err) }
その他
- 正規表現
- メールアドレス の仕様
- Mongo
- DocumentValidation
- 変更、削除の時に注意が必要
- 差分のみを保存しようとするので、そういった観点で仕様を理解すると良さそう
- DocumentValidation
- コードを書くときにホスピタリティが足りない
- 自分にしか伝わらないコードを書いている
- リーダーシップについて
- 人を引っ張っていくことは自分には難しいかも
- でも、まずは自分が楽しむってことはできそう
- そのためには自分の解釈が大事
- まずは他者より自分を律する
学習中
- https://www.udemy.com/course/typescript-complete/
- 体系的に学習したい & 倍速でサクッと学習したい
- ハンズオンなのでわかりやすい
- Goならわかるシステムプログラミング
- 会社の上司に勧めらた本
- 難易度高いな〜と感じてて寝かせてたけど、気合入れて読んでみたら意外と読めてる