2016-09-25 15 views
26

私はtypescriptの新作です。私は2つのクラスを持っています。私が持っている親クラスでは:子クラスでエラー:タイプにコールシグネチャがない式を呼び出すことはできません

abstract class Component { 
    public deps: any = {}; 
    public props: any = {}; 

    public setProp(prop: string): any { 
    return <T>(val: T): T => { 
     this.props[prop] = val; 
     return val; 
    }; 
    } 
} 

私が持っている:

class Post extends Component { 
    public toggleBody: string; 

    constructor() { 
    this.toggleBody = this.setProp('showFullBody'); 
    } 

    public showMore(): boolean { 
    return this.toggleBody(true); 
    } 

    public showLess(): boolean { 
    return this.toggleBody(false); 
    } 
} 

showMoreとShowLess両方は私にエラーを与えて、「そのタイプのコールサインを欠い表現を呼び出すことはできません。」

しかし、setPropがDOESに返す関数には呼び出しシグネチャがあると私は思いますか?私は機能のタイプについて重要なことを誤解していると思うが、それが何であるか分からない。

ありがとうございます!

+1

'togglrBody'は文字列であってはなりません。それは関数にしたいからです。 – eavidan

+0

@eavidanはいこれは実際にブール値を返す関数です。もともとは文字列を返すと思っていました。だから私はそれを何に変更するのですか? – Justin

+0

setPropが返すものは、 '(val:T)=> T' – eavidan

答えて

16

返される関数にコールシグネチャがありますが、Typescriptにそのシグネチャに: anyを追加して完全に無視するように指示しました。

しないでください。あなたのコードで

+0

のようです。進捗状況、ありがとう!今度は "エラーTS2322:タイプ '(val:T)=> T'は 'boolean'タイプに割り当てられません。"私が:anyを削除した場合。私がこれを追加したのはこれだと思います。私は実際にはまだ元のエラーを取得します。 – Justin

+0

これを行い、 'public toggleBody:boolean;'を 'public toggleBody:any; 'に変更すると動作します。 – Justin

+1

@Justinなぜあなたは他の何かを期待しましたか? 'this.toggleBody'は' boolean'を返すべきだと主張しますが、それはあなたが割り当てた 'setProp'の戻り値とは一致しません。あなたは、あなたが実際に送ったり来たりしたいことを考えずに、ランダムに投げ込んでいるようです。 – jonrsharpe

10

"Cannot invoke an expression whose type lacks a call signature."

class Post extends Component { 
    public toggleBody: string; 

    constructor() { 
    this.toggleBody = this.setProp('showFullBody'); 
    } 

    public showMore(): boolean { 
    return this.toggleBody(true); 
    } 

    public showLess(): boolean { 
    return this.toggleBody(false); 
    } 
} 

あなたはpublic toggleBody: string;を持っています。関数としてstringを呼び出すことはできません。したがって、上のエラーは:this.toggleBody(true);

3

this.toggleBody(false);私が何をしたいことはあると思う:

abstract class Component { 
    public deps: any = {}; 
    public props: any = {}; 

    public makePropSetter<T>(prop: string): (val: T) => T { 
    return function(val) { 
     this.props[prop] = val 
     return val 
    } 
    } 
} 

class Post extends Component { 
    public toggleBody: (val: boolean) => boolean; 

    constructor() { 
    super() 
    this.toggleBody = this.makePropSetter<boolean>('showFullBody') 
    } 

    showMore(): boolean { 
    return this.toggleBody(true) 
    } 

    showLess(): boolean { 
    return this.toggleBody(false) 
    } 
} 

重要な変更がsetPropである(すなわち、新しいコードでmakePropSetter)。あなたが本当にやっていることは、これは、プロパティ名を提供する関数であり、そのプロパティを変更できる関数を返します。

makePropSetter<T>では、その機能を特定の種類にロックすることができます。サブクラスのコンストラクタ内の<boolean>は、実際はオプションです。 toggleBodyに割り当てているので、既に完全に指定された型があるので、TSコンパイラはそれを独自に実行することができます。

次に、サブクラスでその関数を呼び出し、戻り値の型が特定の署名付き関数であると正しく理解されるようになりました。もちろん、toggleBodyに同じ署名を尊重する必要があります。

関連する問題