[英]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.