const data = "prop"
const obj: {
"user-id": string;
1: number;
// ここがオブジェクトのキーになる
[data]: string
} = {
"user-id": "foo",
1:1,
[data]: "hello"
}
{
"user-id": "foo",
"1": 1,
"prop": "hello"
}
type Engineer = {
name: string;
role: string;
}
type Blogger = {
name: string;
follower: number;
}
// インターセクション型
type EngineerBlogger = Engineer & Blogger;
// インタフェースでも書くことができる
interface EngineerBlogger extends Engineer, Blogger{}
// どちらのタイプにもあるプロパティに値を設定する必要がある。
const quill: EngineerBlogger = {
name: "Quill";
role: "front-end";
follower: 1000;
}
// stringとnumberだと存在しないため、never型になる
type tmp = string & number;
// 以下のユニオン型を用意する
type NumberBoolean = number | boolean;
type StringNumber = string | number;
// インターセクション型を定義すると、型はnumberになっている。
// ユニオン型のどちらにもnumberが定義されているため、numberとなる
type Mix = NumberBoolean & StringNumber;
type Engineer = {
name: string;
role: string;
}
type Blogger = {
name: string;
follower: number;
}
type EngineerBlogger = Engineer & Blogger;
interface EngineerBlogger extends Engineer, Blogger{}
const quill: EngineerBlogger = {
name: "Quill";
role: "front-end";
follower: 1000;
}
type tmp = string & number;
type NumberBoolean = number | boolean;
type StringNumber = string | number;
type Mix = NumberBoolean & StringNumber;
// typeof
// 型名を確認することができる
function tuUpperCase(x: string | number){
if(typeof x === "string" ){
return x.toUpperCase();
}
return "";
}
// in演算子
// オブジェクトが存在するかしないかを判断することができる
type NomadWorker = Engineer | Blogger;
function describeProfile(nomadWorker: NomadWorker){
console.log(nomadWorker);
if("role" in nomadWorker){
console.log(nomadWorker.role);
}
}
class Dog {
speak(){
console.log("bow-bow");
}
}
class Bird{
speak(){
console.log("tweet-tweet");
}
fly(){
console.log("flutter")
}
}
// instanceof
// 特定のインスタンスから生成されたオブジェクトかどうかを判断することができる
type Pet = Dog | Bird;
function havePet(pet: Pet){
pet.speak();
if(pet instanceof Bird){
pet.fly();
}
}