### 名前空間
– exportで外部から使えるようにする
namespace myapp {
namespace foundation {
export interface printable {
print():void
}
export interface stringable {
getString():string
}
}
export type Person = {
name:string
age:number
}
export class MyData implements
foundation.printable,
foundation.stringable {
people:Person[] = []
constructor(){}
add(nm:string, ag:number){
this.people.push({name:nm, age:ag})
}
print():void {
console.log('*** mydata ***\n' + this.getString())
}
getString():string {
let res = '[\n'
for (let item of this.people){
res += ' "' +item.name+ ' (' + item.age + ')",\n'
}
return res + ']'
}
}
}
const mydata = new myapp.MyData()
mydata.add('taro', 39)
mydata.add('hanako', 28)
mydata.add('sachiko', 17)
mydata.add('jiro', 6)
mydata.print()
### モジュールとプログラムの分割
外部公開: export element
読み込み: import (element) from resources
src/lib.ts
export interface printable {
print():void
}
export interface stringable {
getString():string
}
export type Person = {
name:string
age:number
}
export class MyData implements printable, stringable {
people:Person[] = []
constructor(){}
add(nm:string, ag:number){
this.people.push({name:nm, age:ag})
}
print():void {
console.log('*** mydata ***\n' + this.getString())
}
getString():string {
let res = '[\n'
for (let item of this.people){
res += ' "' +item.name+ ' (' + item.age + ')",\n'
}
return res + ']'
}
}
index.ts
import { MyData } from './lib'
const mydata = new MyData()
mydata.add('taro', 39)
mydata.add('hanako', 28)
mydata.add('sachiko', 17)
mydata.add('jiro', 6)
mydata.print()
$ npm run build
$ node dist/main.js
*** mydata ***
[
“taro (39)”,
“hanako (28)”,
“sachiko (17)”,
“jiro (6)”,
]
### ミックスイン
複数のクラスを継承して機能を引き継ぐ
function applyMixins(derivedCtor: any, constructors: any[]){
constructors.forEach((baseCtor) => {
Object.getOwnPropertyNames(baseCtor.prototype).forEach((name) => {
Object.defineProperty(
derivedCtor.prototype,
name,
Object.getOwnPropertyDescriptor(baseCtor.prototype, name) || Object.create(null)
);
});
});
}
class Person {
name:string = ''
title:string = ''
setPerson(nm:string, tt:string):void {
this.name = nm
this.title = tt
}
}
class Pet {
kind:string = ''
age:number = 0
setPet(k:string, ag:number):void {
this.kind = k
this.age = ag
}
}
class Me {
print():void {
console.log(this.name + ' (' + this.age + ')\n'
+ '"' + this.title + '". pet is ' + this.kind + '!')
}
}
interface Me extends Person, Pet {}
applyMixins(Me, [Person,Pet])
const me = new Me()
me.setPerson('taro', 'designer')
me.setPet('cat', 2)
me.print()
### 非同期処理とasync/await
実行したら後はどれがいつ終わるかわからない
function action(dt:number){
return new Promise(resolve=>{
setTimeout(()=> {
console.log('fished promise!')
resolve("delay:" + dt)
}, dt)
})
}
action(2000).then(res=>console.log(res))
action(1000).then(res=>console.log(res))
action(500).then(res=>console.log(res))
awaitは非同期でも処理が完了するまで待つ
async function doit(){
let re1 = await action(2000)
console.log(re1)
let re2 = await action(1000)
console.log(re2)
let re3 = await action(500)
console.log(re3)
}
doit()
### ネットワークアクセス
fetch().then(response=> hoge) と書く
function getData(url:string){
fetch(url).then(res=>res.text()).then(re=>{
console.log(re)
})
}
const url = 'https://tuyano-dummy-data.firebaseio.com/message.json'
getData(url)
firebaseはCORSを解放しているが、解放していないサイトも多い
function getData(url:string){
fetch(url).then(res=>res.json()).then(re=>{
for (let item of re){
console.log(item)
}
})
}
const url = 'https://tuyano-dummy-data.firebaseio.com/sample_data.json'
getData(url)
### ネットワークに同期アクセス
アクセスを非同期化する
async function getData(url:string){
const response = await fetch(url)
const result = await response.json()
for(let item of result){
console.log(JSON.stringify(item))
}
}
const url = 'https://tuyano-dummy-data.firebaseio.com/sample_data.json'
getData(url)
### POST送信
async function getData(url:string, obj:object){
await fetch(url, {
method: 'POST',
mode: 'cors',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(obj)
})
const response = await fetch(url)
const result = await response.json()
console.log(result)
}
const url = "https://tuyano-dummy-data.firebaseio.com/sample_data.json"
const obj = {
title: 'hello!',
message: 'This is sample message!'
}
getData(url, obj)
なるほど、TypescriptというよりJavaScriptでも重要なことやな