const article = {
title: 'タイトル',
category: 'post',
published: '2019-01-12',
tags: ['blog', 'food'],
content: '今日はいい天気',
}
const article = {
title: 'タイトル',
category: 'post',
published: '2019-01-12',
tags: ['blog', 'food'],
content: '今日はいい天気',
}
article.title = 12345 // <= Type '12345' is not assignable to type 'string'.
const article: {
title: string | null, // => 文字列 か null
category: 'post' | 'page', // => 'post' か 'page'
published: string, // => 文字列
tags: string[] | number[], // => 文字列か数値の値を持った配列
content: string, // 文字列
} = {
title: 'タイトル',
category: 'post',
published: '2019-01-12',
tags: ['blog', 'food'],
content: '今日はいい天気',
}
// string | null
// -> 共用体型(Union Types) という型です。
// `|` で複数の型を指定して使います。
// 指定した型のいずれかに該当していることを示しています。
// 単に複製してみた例
const otherArticle: {
title: string | null,
category: 'post' | 'page',
published: string,
tags: string[] | number[],
content: string,
} = {
title: 'タイトル',
category: 'post',
published: '2019-01-12',
tags: ['blog', 'food'],
content: '今日はいい天気',
}
同じ記述は共通化しておきたいですね…
// const, let, var のような変数を定義するように、
// 型に名前をつけることができる
type title = string
type category = 'post' | 'page'
type articleType = {
title: string,
category: 'post' | 'page',
published: string,
tags: string[],
content: string,
}
// 定義した名前は型注釈の型として実装することができる
const article: articleType = {
title: 'タイトル',
category: 'post',
published: '2019-01-12',
tags: ['blog', 'food'],
content: '今日はいい天気',
}
interface articleInterface {
title: string;
category: 'post' | 'page';
published: string;
tags: string[] | number[];
content: string;
}
const article: articleInterface = {
title: 'タイトル',
category: 'page',
published: '2019-01-15',
tags: [345],
content: '明日もいい天気',
};
// interface を class に実装してみる
interface GreeterInterface {
greeting: string
greet(): string
}
class Greeter implements GreeterInterface {
greeting: string;
constructor(message: string) {
this.greeting = message;
}
greet() {
return "Hello, " + this.greeting;
}
}
let greeter = new Greeter("world");
// extends を使って使って interface を拡張する
interface RobotInterface {
createdTime: Date
name: string
new (name: string)
}
interface extendRobotInterface extends RobotInterface {
skill: string[]
}
class Robot implements extendRobotInterface {
createdTime = new Date()
name: string
skill: string[]
constructor(name: string) {
this.name = name
this.skill = 12345
}
}
//let greeter = new Robot('robo-taro');
let greeter = new Robot(12345); // <- 数値を入れようとしているのでエラー(クラス定義部分にエラーがでる)
// オブジェクト構造を定義できる
type articleType = {
title: string,
category: 'post' | 'page',
published: string,
tags: string[] | number[],
content: string,
}
interface articleInterface {
title: string;
category: 'post' | 'page';
published: string;
tags: string[] | number[];
content: string;
}
const article: articleType = {
title: 'タイトル',
category: 'page',
published: '2019-01-15',
tags: [345],
content: '明日もいい天気',
};
interface PointInterface {
x: number
y: number
}
type PointType = {
x: number
y: number
}
const Point_1: PointInterface = {
x: 1100,
y: 'hoge' // (property) PointInterface.y: number
}
const Point_2 : PointType = {
x: 1100,
y: 'hoge' // (property) y: number
}
PointInterface.y: number // <- Interface の名前が反映されている
(property) y: number // <- 型の情報だけが表示される
const Point_2 : PointType = {
x: 1100,
// y: 'hoge'
}
// => Property 'y' is missing in type '{ x: number; }' but required in type 'PointType'.
// const Point_3: PointType
type PointType = {
x: number
y: number
}
interface PointInterface extends PointType {
z: number
add(x: number, y: number, z: number)
}
const Point_1: PointInterface = {
x: 1100,
y: 12345,
z: 5555,
add(x, y, z) {
this.x += x
this.y += y
this.z += z
}
}
type PointType = {
x: number
y: number
}
// type を implements できた
class Shape implements PointType {
x = 0
y = "error" // <- エラーになるので interface の実装が判別できている
}
// 交差型を implements に適用してみる
type PointType = {
x: number
y: number
}
type OtherPointType = {
z: number
}
type ExtendsPointType = PointType | OtherPointType
// type を implements できた
class Shape implements ExtendsPointType { // <- 交差型は使えないのでエラーになる
x = 0
y = "error"
}
interface Shape {
x: number,
y: number
}
interface Shape {
// x: string <- 同じ名前のプロパティ名が存在している場合、型が違っているとエラーになってしまう
r: number
}
// interface Greeting {
// x: number
// y: number
// r: number
// }
const shape: Shape = {
x: 1234,
y: 5678,
r: 2345,
}
type Morning = "good morning"
type Evening = "good evening"
type Night = "good night"
interface Greeting {
clone(message: Morning): Morning;
}
interface Greeting {
clone(message: Evening): Evening;
}
interface Greeting {
clone(message: Night): Night;
}
// interface Greeting {
// clone(message: Night): Night;
// clone(message: Evening): Evening;
// clone(message: Morning): Morning;
// }
const hoge: Greeting = {
clone(animal) {
return animal
}
}
hoge.clone("good morning")
type Shape = {
x: number,
y: number
}
type Shape = {
// x: string <- 同じ名前のプロパティ名が存在している場合、型が違っているとエラーになってしまう
r: number
}
const shape: Shape = {
x: 1234,
y: 5678,
r: 2345,
}
type articleType = {
title: string;
}
interface articleInterface {
title: string;
}
// interface に存在しない値を追加してみるしてみる
// -> 型注釈でオブジェクトに型付する場合、どちらもエラー
const articleInterface: articleType = {
title: 'タイトル',
subTitle: 'サブタイトル'
}
const IarticleInterface: articleInterface = {
title: 'タイトル',
subTitle: 'サブタイトル'
}
type articleType = {
title: string;
}
interface articleInterface {
title: string;
}
class articleInterfaceClass implements IarticleInterface {
title = 'クラスで定義された記事のタイトル'
newOption = 'happy'
}
class articleTypeClass implements IarticleType {
title = 'クラスで定義された記事のタイトル'
newOption = 'happy'
}