繁体   English   中英

在 TypeScript 中定义和扩展自定义类型

[英]Define and extend custom types in TypeScript

我正在尝试使用一些额外的扩展方法在 TypeScript 中定义自定义类型,也希望允许我的库的其他用途也扩展这种类型。

想要实现 toJson 方法和更多实用功能,我尝试通过创建两个文件来做到这一点: domain.d.ts 使用以下代码:

export type TermOperator = '=' | '>' | '<' | '!=' | '<=' | '>=' | 'in' | 'not in' | 'like';
export type DomainOperator = '&' | '|' | '!';

export type Term = [left: string, operator: TermOperator, right: string | number | Date | EnumType | undefined | boolean];
export type ScalarDomain = [...Array<DomainOperator | Term>];

export interface Domain extends Array<ScalarDomain | Domain | DomainOperator | Term>
{
    toJson(): string;
    flat(): [string | number | Date | EnumType | boolean | undefined];
    parse(): void;
}

并尝试使用以下代码添加新文件 domain.extension.ts :

Domain.prototype.toJson = function (){ return 'json object'; }

但我收到错误,例如:

错误 TS2693 (TS) 'Domain' 仅指一种类型,但在此处用作值。

不知道如何实现这一点,因为我是 JavaScript 的初学者。

有关更多上下文,这是我打算如何使用此代码的方式:

const term1: Term = ['name', '=', 'amine'];
const term2: Term = ['age', '>', 25];
const term3: Term = ['address', 'like', 'eloued'];

const domain1: Domain = ['|', term1, term2, '&', term3];
const domain2: Domain = ['&', term1, term2, '&', ['city', '=', 'Malaga']];
const domain3: Domain = [domain1, domain2];

const jsonStr: string = domain3.toJson();

类型不能添加功能。

所有这一切:

const domain1: Domain = ['|', term1, term2, '&', term3];

告诉 Typescript domain1应该是Domain类型,如果不是,则会显示类型错误。 不会也不能更改分配给此变量的数组上的特征。

想象一下,所有类型注释都被删除了。 你的代码能用吗? 因为这正是你的代码执行时发生的事情。


如果您想为此数组提供其他方法,您通常会将该值包装在 class 中,以允许您声明其他方法。

例如:

export class Domain {
    constructor(public terms: ScalarDomain) {}

    toJson() {
      return JSON.stringify(this.terms)
    }

    flat() {
      return this.terms.flat()
    }

    parse() {
      console.log('implete parse here')
    }
}

您会使用如下:

const term1: Term = ['name', '=', 'amine'];
const term2: Term = ['age', '>', 25];
const term3: Term = ['address', 'like', 'eloued'];

const domain1 = new Domain(['|', term1, term2, '&', term3]);
domain1.toJson() // fine

看游乐场


或者更实用的方法是创建接受您的数据并用它们做事的函数。

function domainToJson(domain: Domain) { return JSON.stringify(domain) }
function domainFlat(domain: Domain) { return domain.flat() }

const term1: Term = ['name', '=', 'amine'];
const term2: Term = ['age', '>', 25];
const term3: Term = ['address', 'like', 'eloued'];

const domain1: Domain = ['|', term1, term2, '&', term3]
domainToJson(domain1) // fine

看游乐场

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM