これは仕様によるものですか、それともバグですか?
どちらとも言えません...構文が間違っています... try "var copy = typeof(this.data = {});" ...これを言っても、このコードは使用しません...混乱します。 。
@giancarloaうーん、これらのブラケットを追加しないでください。 上記のコードは最小限の問題トリガーであり、本番環境のコードではありません。このようなコードを使用したい場合があります。
ここでthis
をそれ以外に持っていくと、問題はなく、エラーは報告されません。 例えば
class Test {
static data = {};
constructor() {
var copy: typeof Test.data = {};
}
}
仕様による
_TypeQueryExpression:_
_識別子_
_TypeQueryExpression_.
_IdentifierName_
したがって、これは予想されます。
許可されない理由はこういうことだと思います
function foo() {
var x: typeof this.x;
}
this
は多かれ少なかれタイプany
であるため、は完全に有効です。 したがって、クラスでは意味があるかもしれませんが、#229がない限り、他のコンテキストでは意味がありません。
@DanielRosenwasserOOうーん...それならスペックの更新を検討してほしいと思います。 笑。
それは考慮すべきことです。 メンバーが非公開でない場合は、その間に次の方法で簡単に回避できます。
self = this;
var x: typeof self.data;
この機能を待っています。
最も単純なケースをサポートする必要があると思います
var a:typeof this.x = 1;
また、再帰的なtypeofメンバーはエラーにつながるはずです。
ありがとう。
文法を変えれば、このように動作するはずです。
@RyanCavanaugh 、しかし私が与えた文脈でそれを許可することは適切ですか? それは必然的に人々がそうし、彼らのタイプとしてany
を得ることにつながるでしょう。
構文的に正しいということは、それが実際に意味をなさなければならないことを意味する必要はありません、IMO。
ただし、この原因に対して警告が発生する可能性があります。
すでにtypeof foo.bar
を記述できますが、 foo
はany
であり、他の点線の位置にthis.x
を記述できるようになっています。 this
はany
です。 typeof this.x
交差点が例外に値する理由がわかりません。
別のユースケースを追加するだけです。 少し前にlodashの型定義を作成しましたが、サポートされている署名のいくつかは実際には他のメソッドのエイリアスです。 私はそれらを次のように宣言しました:
interface LoDashArrayWrapper<T> {
rest(): LoDashArrayWrapper<T>;
rest(
callback: ListIterator<T, boolean>,
thisArg?: any): LoDashArrayWrapper<T>;
rest(n: number): LoDashArrayWrapper<T>;
rest(pluckValue: string): LoDashArrayWrapper<T>;
rest(whereValue: {}): LoDashArrayWrapper<T>;
drop: typeof rest;
tail: typeof rest;
}
これは、コンパイラのバージョン1.0で問題なく機能しました。 しかし、それはもうコンパイルされません。 そして、これを表現するTypeQueryExpressionを考えることができないため、エイリアスごとに署名のセット全体を複製する以外に、他のオプションは表示されません。
@juanevp関数インターフェースはどうですか?
interface LoDashArrayWrapper<T> {
rest: LoDashArrayWrapperOperation<T>;
drop: LoDashArrayWrapperOperation<T>;
tail: LoDashArrayWrapperOperation<T>;
}
interface LoDashArrayWrapperOperation<T> {
(): LoDashArrayWrapper<T>;
(
callback: ListIterator<T, boolean>,
thisArg?: any): LoDashArrayWrapper<T>;
(n: number): LoDashArrayWrapper<T>;
(pluckValue: string): LoDashArrayWrapper<T>;
(whereValue: {}): LoDashArrayWrapper<T>;
}
承認されました。 非常に簡単に修正する必要がありますか? ただし、これによって矢印関数で_this = this
放出されないことを確認してください。
これは関係がありますか? 次のようにして[ts] Identifier expected.
を取得します。
class UserState {
<strong i="7">@observable</strong> state = {
name : "",
id : "",
};
<strong i="8">@action</strong>
changeUser(user: typeof this.state) { // Error is here
Object.assign(this.state, user);
}
}
export const userState = new UserState();
上記の場合、 this.state
を使用できると便利です。
うーん、私はちょうどこの問題に遭遇しました:(
クラスでオブジェクトを定義しています。
次に、上記のタイプである必要があるタイプパラメータを持つ別のオブジェクトを定義しています。
thing = {
a: 1,
b: 2
};
multi: CMultiDataset<typeof this.thing>;
この場合、インスタンスごとに異なるため、静的変数に変更してtypeof ClassName.thing
と言うのは適切ではありません。 また、 multi
はクラス変数である必要があるため、クラス宣言時にその型を持っている必要があります。
@RyanCavanaugh @DanielRosenwasser @mhegazyは、これは比較的簡単な修正だと考えられていたように聞こえますか? しかし、それは何年にもわたって注目から外れているように見えます...それが実装される可能性はありますか?
@ sam-s4s最近では、代わりにCMultiDataset<this["thing"]>
を記述できるようになりました。 インデックス付きのアクセスは、 typeof
とは異なり、 this
(多形でも)で機能します。
ありがとう@ weswigham-私はCMultiDataset<ClassName['thing']>
を実行できることを知りました。これにより、ほとんどの場合、問題が解決します:)
this
を使用して機能する組み合わせは見つかりませんでした...
@ sam-s4s最近では、代わりに
CMultiDataset<this["thing"]>
を記述できるようになりました。 インデックス付きのアクセスは、typeof
とは異なり、this
(多形でも)で機能します。
試したばかりですが、TypeScript 3.4.4では機能しませんが、@ sam-s4sのものは機能します( ClassName['thing']
)。 「ClassName」だけを使用するのではなく、 this
が機能する方が理にかなっていると思いますか?
私が何かを持っているなら
`` `typescript
public groupByTypes = ['None'、 'Foo'、 'Bar'] as const;
public groupBy:typeof groupByTypes [number];
``
What is the proposed workaround? And I cannot make
groupByTypes` static
最も参考になるコメント
試したばかりですが、TypeScript 3.4.4では機能しませんが、@ sam-s4sのものは機能します(
ClassName['thing']
)。 「ClassName」だけを使用するのではなく、this
が機能する方が理にかなっていると思いますか?