簡體   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