gpt4 book ai didi

typescript - 如何计算 TypeScript 对象类型中正在使用哪些属性?

转载 作者:行者123 更新时间:2023-12-03 08:03:33 25 4
gpt4 key购买 nike

我正在寻找一种方法来计算我的对象类型的哪些部分在我的代码库中实际使用。假设我在 types.ts 文件中有以下内容:

export type Animal = {
id: number;
name: string;
height: number;
isMammal: boolean;
}

在另一个文件中,我进行了一个返回 Animal 的 API 调用:

const getAnimal: (id: number) => Promise<Animal>

在两个单独的文件中,我调用 getAnimal 并使用生成的 Animal

const animal1 = await getAnimal(1);
console.log(`Hi! Animal with id ${animal1.id} is named ${animal1.name}.`)
const animal1 = await getAnimal(1);
console.log(`This animal is ${animal1.height} feet tall.`)

但是我的项目中没有任何地方使用 isMammal 属性。如何编写一个脚本来扫描项目中的所有文件并告诉我 isMammal 未在 Animal 类型上使用?或者,只有 idnameheight

最佳答案

要使用编译器 API 执行此操作,您需要通过 ts.createLanguageService(...) 使用并设置 ts.LanguageServer,然后使用 findReferences 方法,它返回所有使用的引用,类似于编辑器中发生的情况。

这是一个独立的示例:

// setup code because doing this with the compiler API alone is a lot to show
import { createProjectSync, ts } from "https://deno.land/x/<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="7d090e2210120f0d153d4c48534c534d" rel="noreferrer noopener nofollow">[email protected]</a>/bootstrap/mod.ts";

const project = createProjectSync();
const sourceFile = project.createSourceFile("file.ts", `
export type Animal = {
id: number;
name: string;
height: number;
isMammal: boolean;
};

const animal: Animal = {} as any;
animal.id;
animal.name;
animal.height;
`);
const languageService = project.getLanguageService();

// compiler API code starts here
const animalType = sourceFile.statements[0] as ts.TypeAliasDeclaration;
const animalObjectType = animalType.type as ts.TypeLiteralNode;

for (const member of animalObjectType.members) {
if (ts.isPropertySignature(member)) {
const findResult = languageService.findReferences(
sourceFile.fileName,
member.name.getStart(sourceFile),
);
const references = (findResult ?? [])
.reduce<ts.ReferencedSymbolEntry[]>((a, b) => a.concat(b.references), [])
.filter(r => !r.isDefinition);
if (references.length === 0) {
console.log(member.name.getText(sourceFile));
}
}
}

输出:

isMammal

关于typescript - 如何计算 TypeScript 对象类型中正在使用哪些属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73141186/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com