ウェブサイト検索

typescript - Angular Aot エラー - エクスポートされた関数への参照で関数を置き換える方法


私はこのコードを持っています

export function LocalStorage(key?: string) {
    return WebStorage(localStorage, key);
}

export function WebStorage(webStorage: Storage, key: string) {
        return (target: Object, propertyName: string): void => {
            key = key || propertyName;

            let storageKey = WebStorageUtility.generateStorageKey(key);
            let storedValue = WebStorageUtility.get(webStorage, key);
            ...
            Object.defineProperty(target, propertyName, {
                get: function() { ... },
                set: function(value: any) { .. },
            });
        }
    };

Angular CLIで--aotフラグを使用してプロジェクトをビルドしたときに、次のエラーを回避するにはどうすればよいですか。

エラー: シンボルの値を静的に解決中にエラーが発生しました。関数呼び出しはサポートされていません。関数やラムダをエクスポートされた関数への参照に置き換えることを検討してください(元の .ts ファイルの位置 15:12)。上記のファイル内でシンボル WebStorage を解決中にエラーが発生しました。

注: 上記のコードでは、位置 15:12 は (target: Object, propertyName: string): void => { です。

Angularコンポーネントでは、LocalStorageはプロパティデコレーターとして使用されます。例えば、

@LocalStorage() username: string = "";

回答 #1

この WebStorage をどう使うかはよくわかりませんし、エラーが出る場所としては奇妙に見えますが、一般的にはエラーメッセージが示す通りに関数を抽出することを行います。

したがって、WebStorage 関数をリファクタリングして、その内容を新しいエクスポートされたメソッドとして抽出することができます:

export function WebStorageInner(target: Object, propertyName: string) {
        ...
        Object.defineProperty(target, propertyName, {
            get: function() { ... },
            set: function(value: any) { .. },
        });
    }

そして最初のものにそれを使用します:

export function WebStorage(webStorage: Storage, key: string) {
    ...
    return WebStorageInner(target, propertyName);
};