使用 TS Compiler API 确定接口属性签名是否允许未定义(例如 prop1?: string;)

发布于 2025-01-11 14:15:11 字数 303 浏览 0 评论 0原文

我正在使用 TypeScript 编译器 API 来收集接口详细信息,以便我可以创建数据库表。效果很好,但我想确定字段是否可以为空,或者用 TS 术语来说,是否有像 string|undefined 这样的类型保护。

export default interface IAccount{
name: string;
description?: string;

我希望能够将属性“描述”识别为字符串|未定义,因此“可为空 我可以通过编译器 API 访问节点文本并找到“?”但还有更好的办法吗?

I am using the TypeScript Compiler API to harvest Interface details so I can create database tables. Works well but I would like to identify whether fields are nullable, or in TS jargon, have a type guard like string|undefined.

Eg

export default interface IAccount{
name: string;
description?: string;

}

I would like to be able to identify property "description" as string|undefined and hence, "nullable". I can access the node text via the compiler API and find "?" but is there a better way?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

以酷 2025-01-18 14:15:11

InterfaceDeclaration 节点包含 node.membersPropertySignature 节点),如果此类属性签名包含 questionToken 键,则它可以为空:

const str = `
interface IAccount {
  name: string;
  description?: string;
}
`;
const ast = ts.createSourceFile('repl.ts', str, ts.ScriptTarget.Latest, true /*setParentNodes*/);
const IAccount = ast.statements[0];
for (const member of IAccount.members) {
    const name = member.name.getText();
    let nullable = 'not nullable';
    if (member.questionToken !== undefined) {
        nullable = 'nullable';
    }
    console.log(`${name} is ${nullable}`);
}

输出:

name is not nullable
description is nullable

The InterfaceDeclaration node contains node.members (PropertySignature nodes) and if such property signature contains a questionToken key, it is nullable:

const str = `
interface IAccount {
  name: string;
  description?: string;
}
`;
const ast = ts.createSourceFile('repl.ts', str, ts.ScriptTarget.Latest, true /*setParentNodes*/);
const IAccount = ast.statements[0];
for (const member of IAccount.members) {
    const name = member.name.getText();
    let nullable = 'not nullable';
    if (member.questionToken !== undefined) {
        nullable = 'nullable';
    }
    console.log(`${name} is ${nullable}`);
}

Output:

name is not nullable
description is nullable
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文