Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
TypeScriptで書くAngularJS @ GDG神戸2014.8.23
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
OKUNOKENTARO
August 23, 2014
Programming
400
2
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
TypeScriptで書くAngularJS @ GDG神戸2014.8.23
2014年8月23日発表分の資料をSlideShareより再掲。
http://www.slideshare.net/armorik83/gdgkobe-angularjs-2
OKUNOKENTARO
August 23, 2014
More Decks by OKUNOKENTARO
See All by OKUNOKENTARO
トレタO/X アーキテクチャ移行記 Next.js App Router化への道のり / TORETA TECH UPDATE 1
okunokentaro
5
12k
Podcastを継続する技術 / refactoradio-240119
okunokentaro
1
220
Webアプリケーション設計の第一歩は ディレクトリの整理から / Encraft 1
okunokentaro
33
10k
JSONとJSON Schemaを改めて理解する / tokyo_study
okunokentaro
9
2.5k
それでもどうしてRecoilを使うのか / Harajuku.ts Meetup Recoil
okunokentaro
19
5.7k
TypeScriptは10年でこんなに進化しました / TechFeed Experts Night 11
okunokentaro
6
1.8k
Hasura.io RDBをサクサク作る方法はARやO/RMだけじゃなくなりました/hasura-io
okunokentaro
5
730
コードには型アノテーションよりも要件アノテーションを増やせ!/harajukuts2
okunokentaro
14
6.6k
10年と3ヶ月でWebサービスを作った話 / Piyogrammer Conference 2021
okunokentaro
2
1.1k
Other Decks in Programming
See All in Programming
継続モナドとリアクティブプログラミング
yukikurage
3
670
AI時代、エンジニアはどう育つのか -未経験エンジニアの成長を間近で見て考えたこと-
thasu0123
0
210
『コードを書く以外の』エンジニアリング〜課金基盤移行プロジェクト推進のためのTips4選
yuriko1211
0
560
コーディングルールの鮮度を保ちたい for SRE NEXT 2026 / keep-fresh-go-internal-conventions-sre-next-2026
handlename
0
160
今さら聞けない .NET CLI
htkym
0
170
ここ半年くらいでAIに作らせたR用ツール
eitsupi
0
360
PHPだって関数型したい 〜できること、できないこと〜 / fp-in-php
jsoizo
1
260
アルゴリズムは何を圧縮しているのか ─ Haskell から育った「圧縮代数」というメンタルモデル
naoya
16
3.7k
komatsuna「分散システムにおけるバグ分析手法」
komatsunaqa
0
150
改善しないと、タスクが回らない。 “てんこ盛りポジション” を引き継いだ情シスの、入社3ヶ月の業務改善録
krm963
0
240
TSX の <Hoge<Fuga>> という構文に驚いた話 / tsx-type-argument-syntax
kanaru0928
0
170
Prismを使った型安全な暗号化_関数型まつり2026
_fhhmm
0
160
Featured
See All Featured
Agile Actions for Facilitating Distributed Teams - ADO2019
mkilby
0
230
Bootstrapping a Software Product
garrettdimon
PRO
307
120k
Rebuilding a faster, lazier Slack
samanthasiow
85
9.6k
It's Worth the Effort
3n
188
29k
Max Prin - Stacking Signals: How International SEO Comes Together (And Falls Apart)
techseoconnect
PRO
0
330
How to Ace a Technical Interview
jacobian
281
24k
Exploring the relationship between traditional SERPs and Gen AI search
raygrieselhuber
PRO
2
4.2k
Impact Scores and Hybrid Strategies: The future of link building
tamaranovitovic
0
350
More Than Pixels: Becoming A User Experience Designer
marktimemedia
3
470
How To Speak Unicorn (iThemes Webinar)
marktimemedia
1
520
Marketing Yourself as an Engineer | Alaka | Gurzu
gurzu
0
270
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
47
8.2k
Transcript
5ZQF4DSJQUד剅ֻ "OHVMBS+4 "OHVMBS+4⹈䓼⠓CZ(%(牞䨫
"OHVMBS+4ךְְהֿ ˖ غ؎ٝسָ知⽃ 涪⚥חٌثك٦ءّٝ♳ָ ˖ 3&45GVM"1*䲿ךؿٖ٦يٙ٦ؙ ˖ ط؎ذ؍ـ،فٔה麩ְ ⦐➂ⵃ欽ךءأذي؟ؙה⡲ !BSNPSJL
植㖈ך圓䧭 /PEFKT &YQSFTT .POHP%# "OHVMBS+4 Database RESTful API Controller HTML
#SPXTFS JSON
ְײ.&"/أةحؙ ˖ ..POHP%# ˖ &&YQSFTT ˖ ""OHVMBS+4 ˖ //PEFKT Ⰻ鿇+BWB4DSJQU
Ⰻ鿇+BWB4DSJQU ׳הخٓ؎
http://www.typescriptlang.org/
،ٝ؛٦ز 兛媮5ZQF4DSJQU 剅ְגהְֲ倯
תך倯 כׄת׃׳ֲ
5ZQF4DSJQUהכ ˖ BMU+4הְ鎉铂ךמהא ˖ .JDSPTPGU爡ָ䎃ַ涪 חWָ⳿ ˖ +BWB4DSJQUך♳⡘✼䳔鎉铂 㢌䳔䖓ך+4ا٦أ铣װְׅ ˖
涸㘗➰ֽ ˖ $ח䢪גְⰅװְׅ
ז5ZQF4DSJQU ˖ 傀㶷ך+BWB4DSJQU项欵ծⰋג⢪ִ ˖ 㢌䳔䖓ך+4ا٦أָ铣װְׅ ˖ 涸㘗➰ֽBMU+4ד䝢זծָֿ♧殢ךⵃ挿 ˖ "OHVMBS+4⹛ַׅהـٓؐؠ♳ךرغحؚ ָ㢳涪̔㢌䳔䖓ךا٦أ铣堣⠓ָ㢳ְ
˖ 葿ղ⡲㨣הծ"OHVMBS+4ֽד 㣐鋉垷חזָ ˖ /PEFKT .POHP%#⢘欽ׅה +40/װ0CKFDUך䪔ְָ걼涪 ˖ 涸㘗➰ָֽ⸬ֻ ז5ZQF4DSJQU
˖ ؙٓأك٦أזؔـآؙؑز䭷ぢ鎉铂 ˖ Class.prototype.method = function(){… ⦜זQSPUPUZQF剅ֻ䗳銲כ֮תׇ ˖ ٗآحؙכⱄⵃ欽ךؙٓأחתה ˖
5ZQPכ؝ٝػ؎ָٓⰋ⸂ד䭷䶯 ˖ ؝ٝػ؎ٕؒٓ٦ָ⳿וֶַַֿ׃ְ ז5ZQF4DSJQU
5ZQF4DSJQU⢪ֲה 䠬⹛ׅ״
5ZQF4DSJQU ؟ٝفٕ 5ZQF4DSJQUⰕ䒭״䒷欽
class Greeter { private greeting: string; constructor(message: string) { this.greeting
= message; } public greet() { return 'Hello, ' + this.greeting; } } ! var greeter = new Greeter('world'); ! var button = document.createElement('button'); button.textContent = 'Say Hello'; button.onclick = () => { alert(greeter.greet()); }; ! document.body.appendChild(button); TS
var Greeter = (function () { function Greeter(message) { this.greeting
= message; } Greeter.prototype.greet = function () { return 'Hello, ' + this.greeting; }; return Greeter; })(); ! var greeter = new Greeter('world'); ! var button = document.createElement('button'); button.textContent = 'Say Hello'; button.onclick = function () { alert(greeter.greet()); }; document.body.appendChild(button); //# sourceMappingURL=greeter.js.map JS
class Greeter { private greeting: string; constructor(message: string) { this.greeting
= message; } public greet() { return 'Hello, ' + this.greeting; } } ! var greeter = new Greeter('world'); ! var button = document.createElement('button'); button.textContent = 'Say Hello'; button.onclick = () => { alert(greeter.greet()); }; ! document.body.appendChild(button); TS
class Greeter { private greeting: string; constructor(message: string) { this.greeting
= message; } public greet() { return 'Hello, ' + this.greeting; } } ! var greeter = new Greeter('world'); ! var button = document.createElement('button'); button.textContent = 'Say Hello'; button.onclick = () => { alert(greeter.greet()); }; ! document.body.appendChild(button); ̒䒷侧ך㘗 ،ؙإأ⥜귅㶨̓ OFX דㄎל̓ ֿך鴟כ֮ת㢌זְ ̓،ٗ٦ꟼ侧䒭&4⯓《 TS
ך➭ך暴䗙 ˖ 㘗䱿锷֮תׅ ˖ var foo = 'abc'; var foo:
string = 'abc';ה剅ַזֻגְְ ˖ JOUFSGBDFד㹋鄲ךזְ㘗ךך㹀纏 ˖ NPEVMFדせ瑞涸ז⢪ְ倯 ֿֿדְֲNPEVMFכ$PNNPO+4הכ殯ז ˖ آؑطؙٔأծ竰䪫ծזוזו
˖ ַתׁמ孑 ջ5ZQF4DSJQUٔؿ؋ٖٝأ խ7FS㼎䘔ռ ˖ 俑岀ֽדזֻծ涪橆㞮ך圓眠ַ 佄䴂خ٦ٕHSVOU CPXFS UTEזוך 鍑铡䲓鯹
˖ +BWB4DSJQU㛇燉濼陎鯹גתׅ ֶׅׅ剅硂 !WWBLBNF
ַֿֿכ ך鑧
5ZQF4DSJQU⢪ֲًٔحز ˖ "OHVMBS+4כ0CKFDUךװהָ㢳ְ ˖ 㘗➰ֽֿׅהדծ♶僇זفٗػذ؍פך ،ؙإأծ5ZQPծוו䭷䶯ׁ ˖ 䒷侧ח㘗䭷㹀׃גֶֽלծ铎㘗 ♷ִג؝ٝػ؎ٕؒٓ٦涪欰 ˖
孡➰ֻךָ傍ְ䝢תזְ
׃ ˖ ההؙإך֮"OHVMBS+4ך鎸岀זך דծ5ZQF4DSJQU㼪Ⰵחכ䊨㣗ָ䗳銲 ˖ ךֶ鑧׃תׅ
$POUSPMMFSךⴱ劍⻉
<body ng-app> <div ng-controller="SampleCtrl"> <strong>First name:</strong> {{firstName}}<br> </div> </body> HTML
JS function SampleCtrl ($scope) { $scope.firstName = 'John'; $scope.lastName = 'Doe'; ! $scope.getFullName = function () { return $scope.firstName + ' ' + $scope.lastName; }; };
<body ng-app> <div ng-controller="sampleCtrl"> <strong>First name:</strong> {{firstName}}<br> </div> </body> HTML
JS ! 5ZQF4DSJQUכ♶銲הְֲ倯 ֿך剅ֹ倯כװת׃׳ֲ ֮ה֮הخְٓדׅ ̕ function SampleCtrl ($scope) { $scope.firstName = 'John'; $scope.lastName = 'Doe'; ! $scope.getFullName = function () { return $scope.firstName + ' ' + $scope.lastName; }; };
angular.module('MyAngularJs', [/*...*/]); // Setter ! function SampleCtrl ($scope) { $scope.firstName
= 'John'; $scope.lastName = 'Doe'; ! $scope.getFullName = function () { return $scope.firstName + ' ' + $scope.lastName; }; }; ! angular.module('MyAngularJs') // Getter .controller('SampleCtrl', [ '$scope', // 使用するServiceは全て文字列で表記 SampleCtrl ]); JS BOHVMBSNPEVMF ⢪ְת׃׳ֲ
angular.module('MyAngularJs', [/*...*/]); // Setter ! function SampleCtrl ($scope) { $scope.firstName
= 'John'; $scope.lastName = 'Doe'; ! $scope.getFullName = function () { return $scope.firstName + ' ' + $scope.lastName; }; }; ! angular.module('MyAngularJs') // Getter .controller('SampleCtrl', [ '$scope', // 使用するServiceは全て文字列で表記 SampleCtrl ]); JS ֿֿ̓5ZQF4DSJQUח׃תׅ
TS // ... class SampleCtrl { constructor ( public $scope
) { this.$scope.firstName = 'John'; this.$scope.lastName = 'Doe'; ! this.$scope.getFullName = () => { return this.$scope.firstName + ' ' + this.$scope.lastName; }; } } ! angular.module('MyAngularJs') .controller('SampleCtrl', ['$scope', SampleCtrl]);
// ... class SampleCtrl { constructor ( public $scope )
{ this.$scope.firstName = 'John'; this.$scope.lastName = 'Doe'; ! this.$scope.getFullName = () => { return this.$scope.firstName + ' ' + this.$scope.lastName; }; } } ! angular.module('MyAngularJs') .controller('SampleCtrl', ['$scope', SampleCtrl]); TS ̒׳ה孡䭯䝤ְַ׃זְ խֽוծ"OHVMBS+4ך䒷侧כ㟓ִָ խזךד何遤׃גֶֻ ̓،ٗ٦ꟼ侧זךדUIJTָ䭷ׅⰻ㺁כ խ㢌זְ@UIJTהַ׃זֻגְְ ̕DMBTT㹑鎉׃תׅ DMBTTך؝ٝأزؙٓةָ床̓
class SampleCtrl { constructor ( public $scope ) { //
... } } ! class SampleCtrl { public $scope; constructor ($scope) { this.$scope = $scope; // ... } } TS ずֿׄה ׃גתׅ ♳ךקֲָءٝفٕ
؝ٝػ؎ٕ ˖ ➙剅ְ5ZQF4DSJQU؝ٝػ؎ٕׅה ˖ ؒٓ٦ /sample.ts(1,1): Cannot find name 'angular'.
˖ BOHVMBSהְֲ㢌侧כ搀ְה鎉תׅ
ֿד㘗㹀纏ؿ؋؎ٕ ˖ ➭ך+4ا٦أ荈ח׃ծٓ؎ـٓٔח׃ 欽ְהծ؝ٝػ؎ٓכծוך㢌侧ָ㹑鎉 幥ַⴻ倖דֹתׇ ˖ 㘗㹀纏ؿ؋؎ٕה撑⢪ְծ؝ٝػ؎ٓ ח侄ִתׅ
%FOJUFMZ5ZQFE ˖ %FOJUFMZ5ZQFEהְֲ؝ىُصذ؍דכծ +4ٓ؎ـٓٔך剣せוֿח㼎䘔׃ 㘗㹀纏ؿ؋؎ٕ鞢㺡ח⥂㸚׃גְ http://definitelytyped.org/ ˖ K2VFSZ %KT 6OEFSTDPSFKT
+BTNJOF .POHP%#זוזו˘ ˖ "OHVMBS+4֮
TS /// <reference path="angularjs/angular.d.ts" /> ! class SampleCtrl { constructor
( public $scope ) { this.$scope.firstName = 'John'; this.$scope.lastName = 'Doe'; ! this.$scope.getFullName = () => { return this.$scope.firstName + ' ' + this.$scope.lastName; }; } } ! angular.module('MyAngularJs') .controller('SampleCtrl', ['$scope', SampleCtrl]); ̓撑㹑鎉ׅה ̕؝ٝػ؎ָٓ㢌侧BOHVMBS钠陎㘗➰ֹד
TS declare var angular: any; ! class SampleCtrl { constructor
( public $scope ) { this.$scope.firstName = 'John'; this.$scope.lastName = 'Doe'; ! this.$scope.getFullName = () => { return this.$scope.firstName + ' ' + this.$scope.lastName; }; } } ! angular.module('MyAngularJs') .controller('SampleCtrl', ['$scope', SampleCtrl]); ̓EFDMBSFהְֲչ،ٝؽؒٝز㹑鎉պ欽ְה խ㘗㹀纏ؿ؋؎ָٕ搀ֻג؝ٝػ؎ٓח侄ִ խ؝ٝػ؎ٕ穠卓חכ䕦갟׃זְ
TS declare var angular: any; ! class SampleCtrl { constructor
( public $scope ) { this.$scope.firstName = 'John'; this.$scope.lastName = 'Doe'; ! this.$scope.getFullName = () => { return this.$scope.firstName + ' ' + this.$scope.lastName; }; } } ! angular.module('MyAngularJs') .controller('SampleCtrl', ['$scope', SampleCtrl]);
BOZ㘗 ˖ 5ZQF4DSJQUחכOVNCFS TUSJOH CPPMFBOה ְֲفٔىذ؍ـ㘗ָ欽䠐ׁגְ ˖ ך➭ծWPJE OVMM VOEFOFE㘗欽䠐ׁגְ
ֿך㘗דך㢌侧㹑鎉כדֹזְ ˖ BOZ㘗כ䖞勻ך+BWB4DSJQUך㘗 ˖ ؝ٝػ؎ٕؒٓ٦װ䖤׆럀ׇ㜥さװ 㹀纏ؿ؋؎ٕ锃麦דֹזְ㜥さזוח
ًاحسך ⴓⶴ
TS // ... ! class SampleCtrl { constructor ( public
$scope ) { this.$scope.firstName = 'John'; this.$scope.lastName = 'Doe'; ! this.$scope.getFullName = () => { return this.$scope.firstName + ' ' + this.$scope.lastName; }; } } ! // ...
TS // ... ! class SampleCtrl { constructor ( public
$scope ) { this.$scope.firstName = 'John'; this.$scope.lastName = 'Doe'; ! this.$scope.getFullName = () => { return this.$scope.firstName + ' ' + this.$scope.lastName; }; } } ! // ... ! ͕͜͜૿͑ͦ͏ͳͷ ʹݟ͍͑ͯΔʜ
TS constructor ( public $scope ) { this.init(); ! this.$scope.getFullName
= () => { return this.$scope.firstName + ' ' + this.$scope.lastName; }; } ! private init() { this.$scope.firstName = 'John'; this.$scope.lastName = 'Doe'; }
TS constructor ( public $scope ) { this.init(); } !
private init() { // ... } ! public getFullName(): string { return this.$scope.firstName + ' ' + this.$scope.lastName; } ̕䨱⦼ך㘗
?!
غ؎ٝس怩ח岣䠐 ˖ TDPQFח秡➰ֽגְזְًاحسכ ⹛⡲׃תׇ this.$scope.getFullName = () => { return
// ... }; 何㢌כׯהغ؎ٝسׁגְ
TS constructor ( public $scope ) { this.init(); this.$scope.getFullName =
this.getFullName.bind(this); } ! private init() { // ... } ! public getFullName(): string { return this.$scope.firstName + ' ' + this.$scope.lastName; } 姻׃ֻכCJOE ⢪ְתׅ
ד CJOE׃זֻגְְ 倯岀ָ֮
剑鵚崧遤אא֮ $POUSPMMFSBT邌鎸
<body ng-app> <div ng-controller="SampleCtrl"> <strong>First name:</strong> {{firstName}}<br> <strong>Last name:</strong> {{lastName}}<br>
<strong>Full name:</strong> {{getFullName()}}<br> </div> </body> HTML
<body ng-app> <div ng-controller="SampleCtrl as c"> <strong>First name:</strong> {{c.firstName}}<br> <strong>Last
name:</strong> {{c.lastName}}<br> <strong>Full name:</strong> {{c.getFullName()}}<br> </div> </body> HTML
<body ng-app> <div ng-controller="SampleCtrl as c"> <strong>First name:</strong> {{c.firstName}}<br> <strong>Last
name:</strong> {{c.lastName}}<br> <strong>Full name:</strong> {{c.getFullName()}}<br> </div> </body> HTML ̕呓秛ׅ㢌侧せ ̓㢌侧せفٗػذ؍ խ➰ֽזְהSPPU4DPQF䪔ְ
TS class SampleCtrl { public firstName: string; public lastName: string;
! constructor () { this.init(); } ! private init() { this.firstName = 'John'; this.lastName = 'Doe'; } ! public getFullName(): string { return this.firstName + ' ' + this.lastName; } } ! angular.module('MyAngularJs') .controller('SampleCtrl', [SampleCtrl]);
TS class SampleCtrl { public firstName: string; public lastName: string;
! constructor () { this.init(); } ! private init() { this.firstName = 'John'; this.lastName = 'Doe'; } ! public getFullName(): string { return this.firstName + ' ' + this.lastName; } } ! angular.module('MyAngularJs') .controller('SampleCtrl', [SampleCtrl]); ̕TDPQF♶銲 ̒TDPQF♶銲 ̒UIJTך湫䱸ךفٗػذ؍ח խזךד㘗㹀纏
$POUSPMMFSBT邌鎸כ 5ZQF4DSJQUה湱䚍ְְָ
$POUSPMMFSBTךًٔحز ˖ $POUSPMMFSطأز׃㜥さחծ㢌侧せך ֶַ־ד僇然חז ˖ "OHVMBS+4ך䠐㔳׃זְفٗػذ؍㢌刿 ־ ˖ ׃גծ5ZQF4DSJQUךؙٓأה湱䚍ְְָ
$POUSPMMFSBTךرًٔحز ˖ QSJWBUFזًاحس)5.-♳ד䭷㹀ׅל ⢪ִג׃תֲ ˖ 5ZQF4DSJQU؝ٝػ؎ٓכ)5.-ח㼎׃גכ⫴ַזְ ˖ )5.-♳ד{{c.$scope.firstName}}הׅל غ؎ٝسדⵖꣲדָֹծ׳הⱔꞿ ˖
5ZQF4DSJQU⢪זְז㉏겗זְ
דCJOE 'BDUPSZװ%JSFDUJWFד⢪ִךד ⚕倯鋙ִגֶֻץ׃
5ZQF4DSJQUד ֹׅ剅ֽ
4FSWJDFךⴱ劍⻉
ךח ˖ 4FSWJDFה'BDUPSZך麩ְ 椚鍑ׁגְתַׅ
'BDUPSZ angular.module('MyAngularJs') .factory('MyProvider', ['otherProvider', function (otherProvider) { return new MyProvider(otherProvider);
}]); JS angular.module('MyAngularJs') .service('MyProvider', ['otherProvider', MyProvider]); 4FSWJDF JS
'BDUPSZ angular.module('MyAngularJs') .factory('MyProvider', ['otherProvider', function (otherProvider) { return new MyProvider(otherProvider);
}]); JS angular.module('MyAngularJs') .service('MyProvider', ['otherProvider', MyProvider]); 4FSWJDF JS ̓؎ٝأةٝأ欰䧭׃ג鵤ׅ ؝ٝأزؙٓة♷ִג"OHVMBS+4ָ欰䧭ׅ̓ 4JOHMFUPOדׅխ խ
'BDUPSZ angular.module('MyAngularJs') .factory('MyProvider', ['otherProvider', function (otherProvider) { return new MyProvider(otherProvider);
}]); JS angular.module('MyAngularJs') .service('MyProvider', ['otherProvider', MyProvider]); 4FSWJDF JS 5ZQF4DSJQUד 䪔ְװְׅךכ4FSWJDF
⢪ְⴓֽ ˖ 4JOHMFUPOַծꟼ侧תה0CKFDUַהְֲ麩ְ ˖ 朐䡾⥂㶷כ4FSWJDFח䬐ׇ׆SPPU4DPQFחׇׁץֹ ˖ 'BDUPSZכ0CKFDU鵤ׅךדծًٝغךⰕך嚊䙀ח 鵚ְךꥷכծBOHVMBSCJOE ׅ ˖
⢪ְװְׅ倯דְְה䙼ג 5ZQF4DSJQUד剅ֻז4FSWJDFַ
أ٦ػ٦ؙٓأכ ˖ ؙٓأك٦أ001הְִל竰䪫 ˖ أ٦ػ٦ؙٓأח꧊秈ׇׁג؟ـؙٓأ ⡲לְְךדכ ̔؝ٝأزؙٓةחⰋגך1SPWJEFS床ׅ"OHVMBS+4 խה竰䪫כ湱䚍ָ䝤ְךדծְְ鑐遤ꐪ铎⚥
խNJYJO鑐׃גְָ姻湫ؔأأًדֹזְ
4FSWJDF 5ZQF4DSJQUד剅ְ⢽
TS class MyResource { constructor( private $q: ng.IQService, private $resource:
ng.resource.IResourceService ) { // ... } ! private resource(): IResourceClass { var baseApi = '/api/entities'; var params: any = null; var actions = { getWithEntityId: { method: 'GET', url: baseApi+'/:id', isArray: true} }; return <IResourceClass>this.$resource(baseApi, params, actions); } ! public fetchEntity(id: my.obj.EntityId): IPromiseReturnEntity { var dfd = this.deferAcceptEntity(); ! var query = {id: id}; this.resource().getWithEntityId( query, this.success(), this.failure() ).$promise.then(this.fetchThen(dfd)); ! return dfd.promise; } private fetchThen(dfd: IDeferredAcceptEntity): (res: my.obj.IEntities) => void { return (res) => { var e: my.obj.IEntity = res[0]; dfd.resolve(e); }; } } ! angular.module('MyAngularJs') .service('MyResource', ['$q', '$resource', MyResource]);
class MyResource { constructor( private $q: ng.IQService, private $resource: ng.resource.IResourceService
) { // ... } ! private resource(): IResourceClass { var baseApi = '/api/entities'; var params: any = null; var actions = { getWithEntityId: { method: 'GET', url: baseApi+'/:id', isArray: true} }; return <IResourceClass>this.$resource(baseApi, params, actions); } ! public fetchEntity(id: my.obj.EntityId): IPromiseReturnEntity { var dfd = this.deferAcceptEntity(); ! var query = {id: id}; this.resource().getWithEntityId( TS ̕BOHVMBSEUTך㘗㹀纏ؿ؋؎ٕ崞欽 ٍ̓ؗأز׃זְה鋵ך㘗ה׃גؒٓ٦⳿ׅ ̕ⴽךؿ؋؎ٕד杝荈ח*3FTPVSDF$MBTT㹀纏 խBOHVMBSEUTFYUFOET竰䪫ׇׁגְ
isArray: true} }; return <IResourceClass>this.$resource(baseApi, params, actions); } ! public
fetchEntity(id: number): IPromiseReturnEntity { var dfd = this.deferAcceptEntity(); ! var query = {id: id}; this.resource().getWithEntityId( query, this.success(), this.failure() ).$promise.then(this.fetchThen(dfd)); ! return dfd.promise; } private fetchThen(dfd: IDeferredAcceptEntity): (res: my.obj.IEntities) => void { return (res) => { var e: my.obj.IEntity = res[0]; dfd.resolve(e); }; } } ! angular.module('MyAngularJs') .service('MyResource', ['$q', '$resource', MyResource]); TS ֿֿתדָⰋג䨱⦼ך㘗 ̕杝荈ך㘗 ̓杝荈ך㘗 ̕%*ׅ1SPWJEFSה荈魦ך؝ٝأزؙٓة խ䧭⸆儗ה㣟侁儗חㄎלꟼ侧 ̒➙㔐כꟼ⤘זְ
♧孡חװֺׅ
剑䖓ח 㘗㹀纏ؿ؋؎ٕך鑧
آؑطؙٔأ ˖ BOHVMBSEUTװBOHVMBSSFTPVSDFEUTחכ החַֻآؑطؙٔأָ⳿גֹתׅ ˖ 䫺䫑䠬ָ֮ה׳הꨇ׃ֻ鋅ִַ
BOHVMBSEUT余殛 $resource<T>(); ↓ ng.resource.IResourceClass<T>型のインスタンス .query(); ↓ ng.resource.IResourceArray<T>型のインスタンス .$promise ↓ ng.IPromise<ng.resource.IResourceArray<T>>型のインスタンス
BOHVMBSEUT余殛 ! ݏΜͳ͖ͬͯͨ $resource<T>(); ↓ ng.resource.IResourceClass<T>型のインスタンス .query(); ↓ ng.resource.IResourceArray<T>型のインスタンス .$promise
↓ ng.IPromise<ng.resource.IResourceArray<T>>型のインスタンス
BOHVMBSEUT ng.resource.IResourceClass<T>型のインスタンス .query(); ↓ ng.resource.IResourceArray<T>型のインスタンス .$promise ↓ ng.IPromise<ng.resource.IResourceArray<T>>型のインスタンス .then<TResult>( successCallback:
(promiseValue: T) => TResult, errorCallback?: (reason: any) => TResult, notifyCallback?: (state: any) => any ): IPromise<TResult>
BOHVMBSEUT ng.resource.IResourceClass<T>型のインスタンス .query(); ↓ ng.resource.IResourceArray<T>型のインスタンス .$promise ↓ ng.IPromise<ng.resource.IResourceArray<T>>型のインスタンス .then<TResult>( successCallback:
(promiseValue: T) => TResult, errorCallback?: (reason: any) => TResult, notifyCallback?: (state: any) => any ): IPromise<TResult> 殅䠐ׅץֹזךכծֿך鴟כ Ⰻ鿇דչמהאך㘗せպד֮הְֲֿה չ5䒷侧חה53FTVMU鵤ׅꟼ侧պ䒷侧הׅ
דծ穠㽷5חכ ⡦Ⰵִִי
BOHVMBSEUT余殛 ng.IPromise<ng.resource.IResourceArray<T>> ה5ָطأز׃גְךדծ(promiseValue: T)ך5כ "ng.resource.IResourceArray<T>"Ⰻ⡤䭷ׅկ ! "ng.resource.IResourceArray<T>"ך⚥ך5כ ♧殢剑ⴱծ$resource<T>()ה剅ְ儗ך5կIResourceArray<T>כ"1* ַ鷏גֻ穠卓ךꂁךֿהկ !
אתծךꂁך⦐ղך㘗$resource<T>()ך5ח䭷㹀׃גֶֽ ל.then()ך⚥ד㘗➰ֽׁ朐䡾ד⢪ִ
*OUFSGBDF⢪ֲ ˖ آؑطؙٔأ걼籕ח䪔ֲהծ㘗荈⡤ָ 䒷侧אךדⱄⵃ欽ךד㉏겗דׅ ˖ JOUFSGBDF㢳欽׃ծ؝٦سⰻח5ָ⳿ג ֿזְ״ֲٓحف׃תׅ ˖ *1SPNJTF3FUVSO&OUJUZ *%FGFSSFE"DDFQU&OUJUZזוכ
ְֲ鑐遤ꐪ铎ך劣ծ欰תת׃
椚鍑ָ帾ת ˖ ⯓➂ח״㘗㹀纏ؿ؋؎ٕכ״ֻדֹ גְ ˖ 㘗㹀纏铣הծ%PDVNFOU铣ח 瘝׃ְ椚鍑ָ䖤 ˖ +BWB4DSJQUֽ剅ְגְծֿֿתד 䠐陎׃זְכ׆
㘗ח걾ֲ 5ZQF4DSJQU剅ֲֿ
׀幠耮ָ֮הֲ׀ְׂת׃