2016-10-27 4 views
0

私たちは、オブジェクトとしてもインターフェイスとしても使う必要があるクラスを持っています。クラスは本当に長い名前を持っているので、我々は一定にして、それを投げたが、その後、奇妙なことが起こった:typescriptのオブジェクトと型の両方としてconstを使用していますか?

class MyClassWithAReallyLongNameThatIsAnnoyinToUse { 
    constructor(public name: string) {} 
    static className = "SomeThing:MyClassWithAReallyLongNameThatIsAnnoyinToUse"; 
} 

// Convenience const to shorten 
const MyClassConst = MyClassWithAReallyLongNameThatIsAnnoyinToUse; 

let someFunction = (staticClassObject: Object, callback) => {}; 

// this errors, saying 'Cannot find name MyClassConst' 
someFunction(MyClassConst, (cmd: MyClassConst) => { /* do some thing */ }); 

をしかし、私たちはconst以下type別名で投げた場合、それが動作します:

class MyClassWithAReallyLongNameThatIsAnnoyinToUse { 
    constructor(public name: string) {} 
    static className = "SomeThing:MyClassWithAReallyLongNameThatIsAnnoyinToUse"; 
} 

// Convenience const to shorten 
const MyClassConst = MyClassWithAReallyLongNameThatIsAnnoyinToUse; 
type MyClassConst = MyClassWithAReallyLongNameThatIsAnnoyinToUse; // <<<<<<<<<<<<< 

let someFunction = (staticClassObject: Object, callback) => {}; 

// this is fine 
someFunction(MyClassConst, (cmd: MyClassConst) => { /* do some thing */ }); 

これは本当に奇妙なようです。 constを変更するだけでなく、同じ割り当てで同じものを2回定義しています。異なるキーワードです。代わりにconstの各場所でプレーンな長いクラス名を使用すると、問題なく動作します。クラスがconstを通してプロキシされているときに問題を引き起こすようにみえるだけです(あるいはletやvarも同様に試みました)。

これはちょうど私たちが暮らしていなければならない変わったものなのでしょうか、あるいは型を得るためにconstで呼び出せるものがありますか?それとも、もう一つの課題がありますか?

答えて

0

タイプエイリアスは、インターフェイスと同様に、コンパイルプロセスで生き残ることができず、コンパイルされたJavaScriptの一部でもありません。
変数に型エイリアスを割り当てることはできません。関数にパラメータとして渡すことはできません。実行時には存在しません。

let a = "string"; 
let b: a; // Error: Cannot find name 'a' 

あなたは単に異なっそれらを使用し、理由タイプの別名とにおける変数の両方に名前を付けるには、競合がないことの:あなたは型として変数を使用することはできません一方

同じ名前。
はインタフェースと同じ作品:そのための

const MyString = "astring"; 
interface MyString { 
    doSomethingSpecial(); 
} 

は決してMyClassConstのconstの「変異」はありません。
クラス(および列挙型)は型として使用できますが、実行時にも存在するため、変数に代入したり、関数に渡したりすることができます。
そのため、あなたはこれをしようとしてエラーが出る:それはdocs for the any typeに述べて

type MyType = string; // Error: Duplicate identifier 'MyType' 
class MyType {} // Error: Duplicate identifier 'MyType' 

enum MyOtherType {} // Error: Duplicate identifier 'MyOtherType' 
let MyOtherType = 3; // Error: Duplicate identifier 'MyOtherType' 

かかわらず、このの、あなたはObjectタイプを使用しないでください:

いずれかのタイプが動作するための強力な方法であります既存のJavaScriptの では、 のコンパイル中に徐々にオプトインしてタイプチェックをオプトアウトすることができます。 他の言語で と同じように、Objectが同様の役割を果たすと思われるかもしれません。あなたが実際にあなたがより良いanyを使用

を存在しますが、あなたも行うことができますものであっても、 上に任意のメソッドを呼び出すことはできません - しかし、Object型の変数は、あなたが それらに任意の値を割り当てることができます:

class MyClassWithAReallyLongNameThatIsAnnoyinToUse { 
    constructor(public name: string) {} 
    static className = "SomeThing:MyClassWithAReallyLongNameThatIsAnnoyinToUse"; 
} 

type MyClassConst = MyClassWithAReallyLongNameThatIsAnnoyinToUse; 
type MyClassConstructor = { 
    new (name: string): MyClassConst; 
    className: string; 
} 
type MyClassHandler = (cmd: MyClassConst) => void; 
const MyClassConst = MyClassWithAReallyLongNameThatIsAnnoyinToUse; 

let someFunction = (staticClassObject: MyClassConstructor, callback: MyClassHandler) => { }; 

someFunction(MyClassConst, (cmd: MyClassConst) => { /* do some thing */ }); 

const MyString = "astring"; 
interface MyString { 
    doSomethingSpecial(); 
} 

code in playground

+0

私は完全にタイプエイリアスについてのOPの一部を逃したので、私は再び書いた答え –

関連する問題