Дескрипторы TypeScript ES7 с выходом ES3?

после просмотра вопросов кажется TS должны поддержка ES3 с декораторами, и у меня есть сценарий, где у меня есть существующая кодовая база в typescript, которая использует декораторы и цели ES5, но теперь мне нужно, по-видимому, поддерживать IE6, который требует ES3.

теперь по: https://github.com/Microsoft/TypeScript/issues/4681

Кажется, что ES3 должен поддерживаться, но если я выведу на целевой ES3 I получить:

error TS1241: Unable to resolve signature of method decorator when called as an expression. Supplied parameters do not match any signature of call target.

Я получаю 0 ошибок, и все работает в ES5, поэтому вам нужно что-нибудь сделать, чтобы заставить его работать в ES3 или он просто не поддерживается?

вот пример cloud 9 проблемы:

https://ide.c9.io/grofit/knockout-decorators-es3-example

просто запустить gulp в командной строке, если вы измените цель tsconfig на es5, она будет работать.

1 ответов


похоже, когда вы нацелены на ES3, декораторы методов не поддерживаются должным образом или вообще не поддерживаются. К сожалению, сообщение об ошибке, которое вы получаете, не очень полезно. Похоже, там было что-то обсуждение сообщение об ошибке. Кроме того, мне не ясно, предназначались ли они для частичной поддержки декораторов при ориентации на ES3 или полной поддержке.

например, если вы пытаетесь использовать метод декоратора таргетинга ES3:

function myMethodDecorator(target: Object, propertyKey: string, descriptor: TypedPropertyDescriptor<any>): TypedPropertyDescriptor<any> {
    // do something
    return descriptor;
};

class MyClass {
    @myMethodDecorator
    myMethod(arg: string) { 
        return "Message -- " + arg;
    }
}

вы получили ошибку сообщение, которое вы сообщили:

ошибка TS1241: невозможно разрешить подпись декоратора метода при вызове в качестве выражения. Указанные параметры не соответствуют подписи целевой звонок.

но если вы попытаетесь применить дескриптор свойства, Несмотря на то, что вы применяя это метод, компилятор странно в порядке с этим. Это компилирует таргетинг ES3 без ошибок:

function myPropertyDecorator(target: Object, propertyKey: string): void {
    // something
};

class MyClass {
    @myPropertyDecorator
    myMethod(arg: string) { 
        return "Message -- " + arg;
    }
}

однако вы можете получить его для компиляции в ES3, когда использование метода декораторов по:

let myMethodDecorator: any = function(target: Object, propertyKey: string, descriptor: TypedPropertyDescriptor<any>): TypedPropertyDescriptor<any> {
    // do something
    return descriptor;
};

class MyClass {
    @myMethodDecorator
    myMethod(arg: string) { 
        return "Message -- " + arg;
    }
}