bugfix> typescript > 投稿

次の import を検討してください宣言。

import { a } from "moduleName"

宣言されたタイプの a を取得するにはどうすればよいですか 。たとえば、 ClassDeclaration または FunctionDeclration または Namespace また、クラスまたは関数の場合の型の名前?

上記の例では、 aImportSpecifier です 、しかし、 typeChecker.getSymbolAtLocation を使用して解決しようとするとおよび typeChecker.getTypeAtLocation 私は Identifier のみを取得しますタイプ any の 。

回答 1 件
  • getTypeAtLocation を使用できます  インポートのタイプのタイプを取得し、 type.getSymbol().getDeclarations() を使用する  シンボルと宣言を取得します。

    次のファイルがあるとします:

    // module.ts
    export class A {
    }
    export function F(){    
    }
    // sample.ts
    import { A, F} from './module';
    
    

    このコードは、インポートの宣言と完全な型名を出力します。

    import * as ts from "typescript";
    function compile(fileNames: string[], options: ts.CompilerOptions): void {
        let program = ts.createProgram(fileNames, options);
        let sample = program.getSourceFile("sample.ts");
        let checker = program.getTypeChecker();
        let list = sample.getChildAt(0) as ts.SyntaxList;
        let importStm = list.getChildAt(0);
        if (ts.isImportDeclaration(importStm)) { // get the declaration 
            let clauses = importStm.importClause;
            let namedImport = clauses.getChildAt(0); // get the named imports
            if (!ts.isNamedImports(namedImport)) return;
            for (let i = 0, n = namedImport.elements.length; i < n; i++) { // Iterate the named imports
                let imp = namedImport.elements[i];
                console.log(`Import: ${imp.getText()}`);
                // Get Type 
                let type = checker.getTypeAtLocation(imp);
                // Full name 
                console.log(`Name: ${checker.getFullyQualifiedName(type.getSymbol())}`);
                // Get the declarations (can be multiple), and print them 
                console.log(`Declarations: `)
                type.getSymbol().getDeclarations().forEach(d => console.log(d.getText()));
            }
        }
    }
    compile(["module.ts", "sample.ts"], {});
    
    

    インターフェースには複雑さがあり、返される型は不明です。これは、コンパイラのこのコメントが示すように意図的に行われ、回避策も示唆しています。

    // It only makes sense to get the type of a value symbol. If the result of resolving
    // the alias is not a value, then it has no type. To get the type associated with a
    // type symbol, call getDeclaredTypeOfSymbol.
    
    

    したがって、インターフェイスには次を使用する必要があります。

    let symbol = checker.getSymbolAtLocation(imp.name)
    // Get Type 
    let type = checker.getDeclaredTypeOfSymbol(symbol);
    
    

あなたの答え