Typescript: typeof this.xxx выдает ошибку "ожидаемый идентификатор".

Созданный на 24 дек. 2014  ·  19Комментарии  ·  Источник: microsoft/TypeScript

image

Это намеренно или ошибка?

Suggestion help wanted

Самый полезный комментарий

@ sam-s4s теперь вы можете писать CMultiDataset<this["thing"]> . Индексированный допускает _до_ работу с this (даже полиморфным), в отличие от typeof .

Я только что пробовал, но он не работает в TypeScript 3.4.4, хотя работает @ sam-s4s ( ClassName['thing'] ). Я думаю, что может иметь больше смысла, что this должен работать, а не использовать только "ClassName"?

Все 19 Комментарий

я бы сказал ни то, ни другое ... это просто неправильный синтаксис ... попробуйте "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.

@DanielRosenwasser OO хм ... тогда надеюсь, вы рассмотрите возможность обновления спецификации. смешно.

Это нужно учитывать; если ваши участники не являются частными, вы можете легко обойти это с помощью следующего.

self = this;
var x: typeof self.data;

Жду эту фичу.
Думаю, стоит поддержать самый простой случай
var a: typeof this.x = 1;

А рекурсивный тип члена должен привести к ошибке.

Благодарю.

Похоже, это должно сработать, если мы изменим грамматику.

@RyanCavanaugh , но можно ли разрешить это в контексте, который я дал? Это неизбежно приведет к тому, что люди сделают это и получат any качестве своего типа.

синтаксически правильный не должен означать, что он действительно должен иметь смысл, ИМО.
Однако по этой причине может быть сделано предупреждение.

Мы уже позволяли вам писать 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"]> . Индексированный допускает _до_ работу с this (даже полиморфным), в отличие от typeof .

Спасибо @weswigham - я действительно узнал, что могу делать CMultiDataset<ClassName['thing']> что в основном избавляет меня от проблем :)

Я не смог найти ни одной комбинации с использованием this которая бы работала, хотя ...

@ sam-s4s теперь вы можете писать CMultiDataset<this["thing"]> . Индексированный допускает _до_ работу с this (даже полиморфным), в отличие от typeof .

Я только что пробовал, но он не работает в TypeScript 3.4.4, хотя работает @ sam-s4s ( ClassName['thing'] ). Я думаю, что может иметь больше смысла, что this должен работать, а не использовать только "ClassName"?

Если у меня есть что-то вроде
машинописный текст
public groupByTypes = ['None', 'Foo', 'Bar'] как const;

общедоступная groupBy: typeof groupByTypes [число];
`` What is the proposed workaround? And I cannot make groupByTypes` статические

Была ли эта страница полезной?
0 / 5 - 0 рейтинги