less than 1 minute read

学んだこと

構造的部分型

  • 構造的
    • 同じ構造をした型であれば区別しない
// 例: 型名は違うが、構造は一緒
type Human = {name: string; age: number};
type Person = {name: string; age: number}
  • 部分型
    • 取れる値の範囲がより広い型への代入は可能
let message: string = "hello";
let mix: string | number = message;
  • 実際に使ってみる
interface Human {
  name: string;
  age: number;
  greeting(message: string): void;
}

class Developer implements Human {
  constractor(public name: string, public age: number, experience: number)
  greeting(message: string){
    console.log("hello");
  }
}

const tmpDeveloper = {
  name: "Quill",
  age: 38,
  experience: 3,
  greeting(message: string){
    console.log(message);
  }
}

// 構造が一緒なので代入することができる
const user: Human = new Developer("Quill", 38, 3);

// これも構造が一緒なので代入することができる
const user: Human = tmpDeveloper;

// 代入時、直接プロパティを書くとexperienceの所でエラーが出る
// experienceが余計なプロパティだからだ
const user: Human = {
   name: "Quill",
  age: 38,
  experience: 3,
  greeting(message: string){
    console.log(message);
  }
}

readonly 修飾子を interface に使ってよむだけのプロパティを作る方法

interface Human {
  readonly name: string;
  age: number;
  greeting(message: string): void;
}

class Developer implements Human {
  constractor(public name: string, public age: number, experience: number)
  greeting(message: string){
    console.log("hello");
  }
}

const tmpDeveloper = {
  name: "Quill",
  age: 38,
  experience: 3,
  greeting(message: string){
    console.log(message);
  }
}
const user: Human = tmpDeveloper;
user.name = "aaa"; // readonlyになっているためエラーになる

let developer: Human = new Developer("Quill", 38, 3);
developer.name = "aaaa" // readonlyになっていないためエラーにならない。