AngularJSとTypescriptとES6で倒したエラー集まとめ(2015/10/10更新

# AngularJSとTypescriptとES6倒したエラー集まとめ（Error出たら更新します）(2015/10/10更新)

AngularJSをTypescirptとES6で記述しているとよく怒られます。
わたしは怒られてもへこたれないのでたまに同じことを怒られます。
なので怒られたらメモろうと思って記述しました。
AngularJSとTypescirptとES6のそれが書いてあります。
誰かの助けになれば幸いです。
※自分のエラー解決方法が間違っていたりずれていたらおせーてね


##　**使い方**

最初にエラーのインデックスとしてそれらを列挙します。
本文もこの順番で登場します
※typescriptでError対象のクラス,プロパティ,インターフェイスは[ClassName][propName][InterfaceName] として記述します(一部)
※こちらは日々更新されていきます。ご了承ください。
※同じエラーが書いてあるかもしれませんが頭の中でmergeしてください
※Atomのlint系プラグインやブラウザのconsoleで怒られた記述です
※くどい箇所ありますし、「Errorエラー」などはtypoじゃありません。SEOを意図してです。

## **Angular Error Index**

* Error: [$injector:modulerr] 
* Error: [$injector:unpr] Unknown provider
* Error: [$compile:nonassign] Expression 'undefined' used with directive 'serchbarInput' is non-assignable!
* Uncaught ReferenceError: moritaController is not defined
* Uncaught Error: [$injector:nomod] Module 'myApp' is not available! You either misspelled the module name or forgot to load it. If registering a module ensure that you specify the dependencies as the second argument.
* Error: [$compile:multidir] Multiple directives
* Error: [ng:areq] Argument ‘[controllerName]' is not a function, got undefined
* Error: [$injector:unpr] Unknown provider: nameProvider <- [prop] <- [controlerName]

## **TypeScript Error Index**
* Value of type 'typeof [ClassName]' is not callable.Did you mean to include 'new'?
* [ClassName] incorrectly implements interface 
'[InterfaceName]'. Property '[propName]' is missing in type [ClassName]
* can not find [propName]
* Supplied parameter do not match any of signature
* protocol Error: Invalid type of argument 'identifier' for method 'Page.removeScriptToEvaluateOnLoad' call. It must be 'string' but it is 'number'.
* property ** is private and only accessible within class~~
* Class ** incorrectly imprements interface 'fafa' property name is ** missing
* constructor impremention is missing. A prametar property is only allowde in a constructor
* Trailing is comma not allow
* Function implementation is missing or not immediately following the declaration.
* Property 'MyController' does not exist on type 'typeof' moritaController;
* declaration or statement expected.
* Cannot invoke an expression whose type lacks a call signature.
* Property 'setValue' does not exist on type 'string'.
* Property ‘[propertyName]’ does not exist on type ‘ClassName'
* 'super' can only be referenced in a  derived class;

## **ES6**
・'const' declarations must be initialized

----

# AngularのErrorエラー
※「AngularJS v1.3.13」、chrome(44.0.2403.130 (64-bit))

## Error: [$injector:unpr] Unknown provider:
* serviceの注入の仕方、
* 定義されていない
* クラス記述していたらコンストラクタに渡す引数みてみて
* classがコンパイルされていない。試しに

```js
controller('fafafa',function(){
     console.log('eee');
})
```
としたら動いた。
serviceとして定義していない物をconstructor内にインスタンス変数として記述していることが原因。  
メンバ変数として定義するようにしましょう
メンバ変数なのにconstructor内にserviceに定義してある物として登録されていませんか？

## Error: [$compile:nonassign] Expression 'undefined' used with directive 'serchbarInput' is non-assignable!
directive内で独自scopeとして{}した変数と、returnオブジェクト内のscopeの変数が被っている

## Uncaught ReferenceError: moritaController is not defined
それが(moritaController)記述されているJSファイル(箇所)が参照されていない

## Uncaught Error: [$injector:nomod] Module 'myApp' is not available! You either misspelled the module name or forgot to load it. If registering a module ensure that you specify the dependencies as the second argument.

訳：不明なエラー：[$インジェクタ：nomod]モジュール「て、myApp」は使用できません！あなたは、どちらかのモジュール名のスペルを間違えたり、それをロードするのを忘れました。モジュールを登録する場合は、2番目の引数としての依存関係を指定してください。

```js

module kenjimorita {
     import controllerInternal = moritaController;
     controllerInternal.initRouting;//×実行されてなかった
     controllerInternal.initRouting();//○
     controllerInternal.MyController;
     controllerInternal.Child;
     controllerInternal.Mago;
}
```
## Error: [$compile:multidir] Multiple directives

directiveが2回呼ばれているからscopeが変な感じになっているよ

## Error: [ng:areq] Argument ‘[controllerName]' is not a function, got undefined
controllerNameが関数として呼ばれていないよ。何かmoduleの構文みたいにDIしてないかい？
  main.controller('name'[name, Morita]);
↓
  main.controller('Morita', Morita);

## Error: [$injector:unpr] Unknown provider: nameProvider <- [prop] <- [controlerName]
constructorはserviceをほしがっているのにDIされていない
↓
[prop]の箇所にserviceを渡す


# Typescript側のErrorエラー
環境
- [AtomエディタのTypescriptのプラグイン](https://atom.io/packages/atom-typescript)や[Playground](http://www.typescriptlang.org/Playground#src=)が吐いたメッセージです
- tsconfig.json　→version": "1.5.0-alpha

## Value of type 'typeof [ClassName]' is not callable.Did you mean to include 'new'?

[実際のエラーコード](http://www.typescriptlang.org/Playground#src=class%20MoritaA%7B%0A%09constructor()%7B%0A%09%09alert('fafafa')%3B%0A%09%7D%0A%7D%0Avar%20morita%20%3D%20MoritaA%3B%0Amorita()%3B%0A)
typeof のところ [typeof] MoritaAに型注釈してね？もしくはnewするってこと？
[解決したコード](http://www.typescriptlang.org/Playground#src=class%20MoritaA%7B%0A%09constructor()%7B%0A%09%09alert('fafafa')%3B%0A%09%7D%0A%7D%0Avar%20morita%3Aany%20%3D%20MoritaA%3B%2F%2Fany%0Amorita()%3B%0A)

## [ClassName] incorrectly implements interface'[InterfaceName]'. Property '[propName]' is missing in type [ClassName]

訳 そのClassにそのプロパティはない。

```ts
module A{
	export interface ImoritaA{
		name:string;
	}
	export class Aclass implements ImoritaA{
		constructor(){
			this.name = "fafa"
		}
	}
}
```
ImoritaAが今回の対象Errorですが、Interfaceはただの型注釈をしているだけなので実体としてのプロパティを設定する。
[これで解決](http://www.typescriptlang.org/Playground#src=module%20A%7B%0A%09export%20interface%20ImoritaA%7B%0A%09%09name%3Astring%3B%0A%09%7D%0A%09export%20class%20Aclass%20implements%20ImoritaA%7B%0A%09%09name%3Astring%3B%0A%09%09constructor()%7B%0A%09%09%09this.name%20%3D%20%22fafa%22%0A%09%09%7D%0A%09%7D%0A%7D%0A%2F%2F%E4%BD%BF%E3%81%86%E9%9A%9B%0Avar%20fa%20%3D%20new%20A.Aclass%0Aalert(fa.name))(引数を取らない場合)



## can not find [引数]
`this.`の付け忘れ、参照してるプロパティへのアクセスが通っていない

## Supplied parameter do not match any of signature 
これ結構出る。。
シグネチャがマッチしないことが原因。
シグネチャとは、要求される「引数の型」、「引数の数」、「返り値の型」です。
そこらへん確認するといいかもです。

エラーの読み方

```
Type of property 'hogehoge' of types A and B are incompatible 
```

Aが渡した値の型、Bが要求されている型、
これがマッチしないと言われている。

//供給されたパラメーターはどのシグネチャともマッチしない
//渡す引数と受ける引数の数が合わない
//`[引き数名?:型]`としてif文で初期化、もしくはパラメーターに初期化を代入

自分はこういうコードででました
[エラーコード](http://www.typescriptlang.org/Playground#src=interface%20IHello%20%7B%0A%20greeting(word%3A%20string)%3A%20string%3B%0A%7D%0A%0Afunction%20doGreeting(hello%3A%20IHello)%7B%0A%09console.log(hello.greeting(%22Typescript%22))%0A%7D%0A%0AdoGreeting(greeting%3A(word%3Astring)%20%3D%3E%20%22hello%22%20)%0A%0A%0A%0A)

[エラーコードの解決コード](http://www.typescriptlang.org/Playground#src=interface%20IHello%20%7B%0A%20greeting(word%3A%20string)%3A%20string%3B%0A%7D%0A%0Afunction%20doGreeting(hello%3A%20IHello)%7B%0A%09console.log(hello.greeting(%22Typescript%22))%0A%7D%0A%0AdoGreeting(%7Bgreeting%3A(word%3Astring)%20%3D%3E%20%22hello%22%7D)%0A%2F%2F%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%BC%E3%83%95%E3%82%A7%E3%82%A4%E3%82%B9%E3%81%A8%E4%BA%92%E6%8F%9B%E6%80%A7%E3%81%AE%E3%81%82%E3%82%8B%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%82%92%E6%B8%A1%E3%81%99%0A%0A%0A)




## protocol Error: Invalid type of argument 'identifier' for method 'Page.removeScriptToEvaluateOnLoad' call. It must be 'string' but it is 'number'.
//コンストラクタに`public name:string`として実行コンテキストに何も書かない場合にでた
//public削除、実行コンテキストの方に`this.name = name`とするとなくなった

## property ** is private and only accessible within class~~
//privateのプロパティに外のスコープからアクセスしようとしている
//classのメンバ変数のアクセス修飾子を確認して

## Class ** incorrectly imprements interface 'fafa' property name is ** missing
//interfaceのプロパティがclassにありませんよ

## constructor impremention is missing. A prametar property is only allowde in a constructor
//引数にinterfaceのとっっているけどconstructor内で使ってね
//constructorの閉じたタグを閉じてね

## Trailing is comma not allow
//コンマはそこにつけちゃだめだよ

## Function implementation is missing or not immediately following the declaration.
訳:(関数の実装が存在しないか、すぐに宣言を次のされていません。)
定義はされているかもだけど関数の実装がされていない、

## Property 'MyController' does not exist on type 'typeof' moritaController;
importした内部モジュール内のclass(object)がexport記述されていない

## declaration or statement expected.
`export fafa = angular.module('',[])`
↓
`var fafa = angular.module()`

## Cannot invoke an expression whose type lacks a call signature.
あなたはプロパティ呼び出しでセットしてあるメンバをメソッド呼び出ししているはず。。

## Property 'setValue' does not exist on type 'string'.
setValueの型注釈がstringで設定されていますが、あなたの渡そうとしている引数で初期化するとstringで返りません。

## Property ‘[propertyName]’ does not exist on type ‘ClassName'
[ClassName]のメンバとして[propertyName]のプロパティは存在しません。

上と一緒だけど、まあいいや
・コンストラクタの引数にしていたらpublicにして見えるようにしてください、もしくは
・そのプロパティorメソッドはインスタンス呼び出しで使用してください(Class内でそのプロパティはthisに向いています。)

```js

aa.get()//Error
↓
new aa().get()
 or 
var bb = new aa();bb.get()
```

## 'super' can only be referenced in a  derived class;
親クラスのコンストラクタにsuper()記述してませんか
子クラスにsuper()は使ってね


# ES6のErrorエラー
環境
- [AtomエディタのTypescriptのプラグイン](ES6のも出してくれるみたい)
## 'const' declarations must be initialized
constは何か初期値代入しないとだよ

**やること**

```
const fafafa = 'このように何か代入してね'
```


## File'/Users/[your]/Desktop/Git/tabibito/src/scripts/service/[importObj[file]]' is not a module.

```
import dddd from './fafa';
```
importするファイルの参照がまちがっているよ

## Cannot find name '[exportObj]'

```export default test;```

としてexportしたい箇所で現れたエラーの場合。

**やること**
class名をexportしてね(TODO)

## 最後に
※あくまでわたしの実行環境でのエラーだったので、「そこら辺をもう一度みてみる」ぐらいの参考でお願いします。