TypeScriptって何?
TypeScript(TS)は、JavaScriptをパワーアップさせたプログラミング言語 だよ!
簡単に言うと、JavaScriptに「型(Type)」をつけられるようにしたもの。
💡 JavaScriptとTypeScriptの違い
JavaScript(JS)は「どんな型のデータでも自由に扱える」けど、それが バグの原因 になりやすい。
TypeScript(TS)は「型を決めておくことで、間違ったデータを入れないようにする」ことができる!
📝 JavaScript(型のチェックがない)
let age = 25; // ここでは数字
age = "hello"; // 文字列にしてもエラーにならない(実行時にバグる可能性あり)
→ JSは型チェックがないので、間違っても動いてしまう...💀
✅ TypeScript(型を指定できる!)
let age: number = 25; // age は「数値型」だと決める
age = "hello"; // ❌ エラーになる!(バグを防げる)
→ TSは「数字の変数に文字を入れようとしてるよ!」とエラーを出してくれる🎯
✅ TypeScriptのメリット
1. 型チェックでバグを防げる!
function add(a: number, b: number): number {
return a + b;
}
add(5, 10); // ✅ OK
add("5", 10); // ❌ エラー(文字列はダメ!)
→ 間違ったデータを入れたら事前にエラーが出るから、安心!
2. コードがわかりやすくなる!
function greet(name: string): string {
return "Hello, " + name;
}
→ 「nameは文字列」「戻り値も文字列」とハッキリわかるので、理解しやすい!
3. 自動補完が強力になる!
TypeScriptは型情報があるので、VS Codeなどのエディタで補完がしっかり効く。
const user = {
name: "Alice",
age: 30
};
console.log(user.); // ← 名前や年齢の補完が出てくる!
→ 「このオブジェクトにはどんなプロパティがあるんだっけ?」を一発で確認できる!
✅ TypeScriptのデメリット
1. 書くのがちょっと面倒
型を明示的に書かないといけないので、コードが長くなることがある。
let name: string = "Alice"; // TS(型を書く必要がある)
let name = "Alice"; // JS(シンプル)
2. コンパイルが必要
TypeScriptのコードは そのままではブラウザで動かせない。
👉 「TypeScript → JavaScript」 に変換(コンパイル)しないといけない。
tsc myfile.ts # TypeScriptをJavaScriptに変換するコマンド
→ 手間はかかるけど、その分バグを減らせる!
✅ TypeScriptを使うべき人
- JavaScriptのバグに困っている人
- 大規模なプロジェクトを作る人
- チーム開発をする人
- VueやReactなどのフレームワークをしっかり使いたい人
👉 「小さいプロジェクト」ならJSで十分だけど、「大きなプロジェクト」ならTSを使ったほうが安全! 🚀
📌 まとめ
JavaScript(JS) | TypeScript(TS) | |
---|---|---|
型チェック | なし(自由だけどバグりやすい) | あり(バグを減らせる) |
実行前のエラー検出 | できない | できる |
コードの分かりやすさ | 型が分かりにくい | 型があるので明確 |
エディタの補完 | 弱め | 強力 |
コンパイル | いらない | 必要(JSに変換する) |
🎯 つまり、TypeScriptは「バグを減らして、安全に開発できるJavaScript」ってこと!
小規模ならJavaScript、大規模ならTypeScriptがオススメだよ! 🚀
Vue2、Vue2(vue-property-decorator)、Vue3 の script
の書き方の違いを分かりやすく説明するね!
1. Vue2(オブジェクト構文)
Vue2では、コンポーネントは 「オブジェクトの形」 で書くのが一般的。
<script>
export default {
data() {
return {
message: "Hello, Vue2!"
};
},
methods: {
sayHello() {
console.log(this.message);
}
}
};
</script>
💡ポイント
-
export default {}
の中にdata()
やmethods
を書く。 -
data()
は「データの箱」を作る関数。 -
methods
の中に関数(sayHello など)を書く。
2. Vue2(vue-property-decorator
を使う場合)
TypeScriptを使いたいときに vue-property-decorator
を入れると、「クラスの形」 で書けるようになる。
<script lang="ts">
import { Vue, Component } from "vue-property-decorator";
@Component
export default class MyComponent extends Vue {
message: string = "Hello, Vue2 with Decorators!";
sayHello() {
console.log(this.message);
}
}
</script>
💡ポイント
-
@Component
を使って、Vueのコンポーネントを クラスの形 にする。 -
message
はdata()
ではなく クラスのプロパティ として書く。 - 関数(
sayHello
)はmethods
の中に書かず、クラスのメソッドとしてそのまま書ける。
3. Vue3(Composition API の場合)
Vue3では、新しい Composition API を使って、データと関数を setup()
の中で定義することができる。
<script setup>
import { ref } from "vue";
const message = ref("Hello, Vue3!");
const sayHello = () => {
console.log(message.value);
};
</script>
💡ポイント
-
setup()
を書かずに、いきなりconst
でデータを作れる。 -
ref("データ")
を使うと、Vueがデータをちゃんと監視できる。 -
message.value
で値を取り出す(Vue2のthis.message
と同じ)。 - 短く書ける & 分かりやすい!
まとめ
Vue2(オブジェクト構文) | Vue2(クラス構文 + Decorators) | Vue3(Composition API) | |
---|---|---|---|
データの書き方 | data() { return { message: "Hello!" }; } |
message: string = "Hello!"; |
const message = ref("Hello!"); |
関数の書き方 | methods: { sayHello() { console.log(this.message); } } |
sayHello() { console.log(this.message); } |
const sayHello = () => { console.log(message.value); }; |
Vue特有の書き方 |
export default {} の中に書く |
クラス export default class extends Vue
|
setup で変数を作る |
どれを使うべき?
- Vue2(オブジェクト構文) → Vue2の基本の書き方。シンプルで分かりやすい。
- Vue2(クラス構文 + Decorators) → TypeScriptを使いたいときに便利。大規模開発向け。
-
Vue3(Composition API) → Vue3では
setup
を使うのが主流。短く書けて分かりやすい。
Vue3を使うなら script setup
が一番シンプルでおすすめ! 🚀
クラス構文自体のメリットではなく、「TypeScriptと相性が良い」ことがメリット だね!
✅ TypeScriptの型チェックでバグを防げるのはなぜ?
クラス構文を使うと、TypeScriptの機能を活かしやすくなるから。
特に以下のような 「型に関するバグ」 を防ぐのに役立つ!
1. this
の型を明確にできる
オブジェクト構文だと this
の型が曖昧で、間違えてもエラーにならないことがある。
でも、クラス構文なら this
の型が MyComponent
だと明確に分かる から、間違いを防げる!
オブジェクト構文(間違えてもエラーにならない)
<script>
export default {
data() {
return {
count: 10
};
},
methods: {
increaseCount() {
this.count += "10"; // 文字列を足してしまうバグ!でもエラーにならない
}
}
};
</script>
→ this.count
に "10"
を足してしまっても、Vueは特に何も言わない😱
クラス構文(間違えたらエラーになる)
<script lang="ts">
import { Vue, Component } from "vue-property-decorator";
@Component
export default class MyComponent extends Vue {
count: number = 10; // 型を指定!
increaseCount() {
this.count += "10"; // ❌ TypeScriptがエラーを出してくれる!
}
}
</script>
→ TypeScriptが「数値に文字列を足すのはおかしい!」とエラーを出してくれる! 🔥
2. props の型チェックができる
オブジェクト構文では props
の型チェックは type
で設定するけど、
クラス構文なら TypeScript の型チェックが使える!
オブジェクト構文(型チェックが甘い)
<script>
export default {
props: {
age: Number // `type: Number` だけでは詳細なチェックができない
}
};
</script>
→ 本当は age
を必須にしたかったのに、 undefined
でもエラーにならない...
クラス構文(しっかり型チェックできる)
<script lang="ts">
import { Vue, Component, Prop } from "vue-property-decorator";
@Component
export default class MyComponent extends Vue {
@Prop({ required: true }) age!: number; // `age` は必須で、型は `number`
}
</script>
→ 必須 (required: true
) なのに undefined
だったらエラーになる! 👍
3. Vuex でも型チェックができる
Vuex の state
や actions
を使うとき、オブジェクト構文だと型が分かりにくいけど、
クラス構文なら @State
や @Action
に型をつけられる!
オブジェクト構文(Vuexの型が分かりにくい)
<script>
import { mapState, mapActions } from "vuex";
export default {
computed: {
...mapState(["count"]) // 型が曖昧
},
methods: {
...mapActions(["increaseCount"]) // 型が分からない
}
};
</script>
→ count
が number
なのか string
なのか、分からない...
クラス構文(Vuexの型をしっかり指定できる)
<script lang="ts">
import { Vue, Component } from "vue-property-decorator";
import { State, Action } from "vuex-class";
@Component
export default class MyComponent extends Vue {
@State count!: number; // `count` は `number` 型
@Action increaseCount!: () => void; // `increaseCount` は関数
}
</script>
→ Vuexのデータや関数の型がハッキリして、ミスを防げる!
結論
✅ クラス構文のメリットは 「TypeScriptと相性が良いこと」
✅ 型チェックができるから、間違いを防ぎやすい!
✅ 大規模開発でも安心して使える!
つまり、クラス構文のメリットの1つが「TypeScriptの型チェックを活かせること」 って感じだね! 😃
クラス構文のメリットの1つが「TypeScriptの型チェックを活かせること」なのは、 TypeScriptがもともとクラスベースのプログラミングに最適化されているから だよ!
✅ TypeScriptはクラスを前提にした仕組みを持っている
TypeScriptは JavaScriptの拡張版 で、クラスベースのプログラミング(OOP: オブジェクト指向プログラミング)をしっかりサポートしている。
クラス構文を使うと、TypeScriptの 型チェック を最大限活かせるようになる!
1. クラスのプロパティに型を明確に定義できる
Vueのオブジェクト構文 (data() {}
) では、データの型をTypeScriptだけで完全に保証するのが難しい。
クラス構文を使うと、this.count
は number
型! と明確に宣言できる。
オブジェクト構文(型が不明確)
<script lang="ts">
export default {
data() {
return {
count: 10, // 本当は `number` だけど、Vueは明確に型を保証できない
};
},
methods: {
increaseCount() {
this.count += "10"; // ❌ エラーにならない(実行時にバグる)
}
}
};
</script>
→ TypeScriptは this.count
の型をちゃんと推測できず、バグを防げない!
クラス構文(型が明確!)
<script lang="ts">
import { Vue, Component } from "vue-property-decorator";
@Component
export default class MyComponent extends Vue {
count: number = 10; // 型をしっかり定義!
increaseCount() {
this.count += "10"; // ❌ TypeScriptがエラーを出してくれる!
}
}
</script>
→ 「countはnumber
型なのに、文字列を足そうとしてるよ!」とエラーになる! ✅
2. クラスのメソッドも型チェックできる
Vueのオブジェクト構文では、メソッドの引数や戻り値の型を厳密にチェックしづらい。
クラス構文なら、TypeScriptの型チェックをフル活用できる。
オブジェクト構文(引数の型が保証されない)
<script lang="ts">
export default {
methods: {
add(x, y) { // ❌ 型が不明
return x + y;
}
}
};
</script>
→ x
や y
に string
を入れてもエラーにならない...
クラス構文(メソッドの型チェックができる!)
<script lang="ts">
import { Vue, Component } from "vue-property-decorator";
@Component
export default class MyComponent extends Vue {
add(x: number, y: number): number {
return x + y;
}
}
</script>
→ x
と y
は number
型じゃないとエラー!型ミスを防げる! ✅
3. Vueのprops
の型チェックが強力になる
オブジェクト構文では、props
の型チェックは type: String
などで指定するが、TypeScriptの型ほど厳密じゃない。
オブジェクト構文(型チェックがゆるい)
<script lang="ts">
export default {
props: {
age: Number // `undefined` や `null` でもエラーにならないことがある
}
};
</script>
→ 意図せず null
や undefined
が入ることも...
クラス構文(型チェックがしっかりできる!)
<script lang="ts">
import { Vue, Component, Prop } from "vue-property-decorator";
@Component
export default class MyComponent extends Vue {
@Prop({ required: true }) age!: number; // `age` は `number` で、必須!
}
</script>
→ number
じゃない値が来たらエラー!型のミスを防げる! ✅
💡 なぜクラス構文だとTypeScriptの型チェックを活かせるのか?
✅ クラス構文は「型を明示的に書ける」
- クラスのプロパティに型を直接指定できる
- メソッドの引数や戻り値に型を指定できる
- Vuexの
state
やactions
にも型をつけられる this
の型が保証されるので、型推論のミスが減る
📌 結論
クラス構文のメリットの1つが「TypeScriptの型チェックを活かせること」なのは、TypeScriptがもともとクラスベースのプログラミングに最適化されているから! 🎯
✅ 型を明示的に定義できる
✅ メソッドやプロパティの型チェックができる
✅ this
の型が保証される
だから、大規模開発やバグを減らしたいときに 「Vue2 + クラス構文 + TypeScript」 がよく使われるんだ! 😊
TypeScriptとオブジェクト構文(Options API)の組み合わせも 可能 だよ!
ただし、クラス構文に比べると 型チェックの力をフルに活かしにくい というデメリットがある。
✅ TypeScript + オブジェクト構文(Options API)の例
<script lang="ts">
export default {
data() {
return {
count: 0 as number, // 型アノテーションをつけることで型を指定
};
},
methods: {
add(x: number, y: number): number {
return x + y;
}
}
};
</script>
🌟 特徴
-
型アノテーション (
as number
など) を使えば、一応型を指定できる - methods に型を指定できる
- Vue2, Vue3 どちらでも使える
💡 クラス構文との違い
比較項目 | オブジェクト構文 + TypeScript | クラス構文 + TypeScript |
---|---|---|
型の明示的な指定 | 手動で as 型 をつける必要がある |
クラスのプロパティに直接型を指定できる |
this の型チェック |
this の型推論がうまくいかないことがある |
this の型が保証される |
Vueの書き方 | Vue2の伝統的な書き方 | TypeScriptに最適化された書き方 |
メリット | Vueの標準的な書き方に慣れている人にとってわかりやすい | 型安全でバグを減らせる、大規模開発向け |
デメリット | 型チェックが甘くなることがある | クラス構文に慣れていないと最初は難しく感じる |
✅ どっちを使うべき?
- Vue2 + TypeScript → クラス構文(vue-property-decorator) のほうがオススメ
- Vue3 + TypeScript → Composition API(setup() の書き方) を使うほうが一般的
ただ、 小規模なプロジェクトならオブジェクト構文 + TypeScript でもOK だよ!