我有这个功能:
function getProduct(id: string){
//return some product
}
其中id实际上是GUID。 Typescript没有guid类型。是否可以手动创建类型GUID
?
function getProduct(id: GUID){
//return some product
}
所以,如果'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'
代替'notGuidbutJustString'
,那么我会看到打字稿编译错误。
更新:正如David Sherret所说:在编译时无法确保基于正则表达式或其他函数的字符串值,但是可以在运行时在一个地方执行所有检查
答案 0 :(得分:15)
您可以在字符串周围创建一个包装器并传递它:
class GUID {
private str: string;
constructor(str?: string) {
this.str = str || GUID.getNewGUIDString();
}
toString() {
return this.str;
}
private static getNewGUIDString() {
// your favourite guid generation function could go here
// ex: http://stackoverflow.com/a/8809472/188246
let d = new Date().getTime();
if (window.performance && typeof window.performance.now === "function") {
d += performance.now(); //use high-precision timer if available
}
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {
let r = (d + Math.random() * 16) % 16 | 0;
d = Math.floor(d/16);
return (c=='x' ? r : (r & 0x3 | 0x8)).toString(16);
});
}
}
function getProduct(id: GUID) {
alert(id); // alerts "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx"
}
const guid = new GUID("xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx");
getProduct(guid); // ok
getProduct("notGuidbutJustString"); // errors, good
const guid2 = new GUID();
console.log(guid2.toString()); // some guid string
答案 1 :(得分:1)
我认为应该对David Sherret的回答有所延伸。
像这样:
// export
class InvalidUuidError extends Error {
constructor(m?: string) {
super(m || "Error: invalid UUID !");
// Set the prototype explicitly.
Object.setPrototypeOf(this, InvalidUuidError.prototype);
}
}
// export
class UUID
{
protected m_str: string;
constructor(str?: string) {
this.m_str = str || UUID.newUuid().toString();
let reg:RegExp = new RegExp("[A-F0-9]{8}-[A-F0-9]{4}-[A-F0-9]{4}-[A-F0-9]{4}-[A-F0-9]{12}", "i")
if(!reg.test(this.m_str))
throw new InvalidUuidError();
}
toString() {
return this.m_str;
}
public static newUuid(version?:number) :UUID
{
version = version || 4;
// your favourite guid generation function could go here
// ex: http://stackoverflow.com/a/8809472/188246
let d = new Date().getTime();
if (window.performance && typeof window.performance.now === "function") {
d += performance.now(); //use high-precision timer if available
}
let uuid:string = ('xxxxxxxx-xxxx-' + version.toString().substr(0,1) + 'xxx-yxxx-xxxxxxxxxxxx').replace(/[xy]/g, (c) => {
let r = (d + Math.random() * 16) % 16 | 0;
d = Math.floor(d/16);
return (c=='x' ? r : (r & 0x3 | 0x8)).toString(16);
});
return new UUID(uuid);
}
}
function getProduct(id: UUID) {
alert(id); // alerts "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx"
}
const guid2 = new UUID();
console.log(guid2.toString()); // some guid string
const guid = new UUID("xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx");
getProduct(guid); // ok
getProduct("notGuidbutJustString"); // errors, good
答案 2 :(得分:1)
能够基于正则表达式在 TypeScript 中定义类型会很好。我知道自 TypeScript 4.1 以来就有字符串文字类型,但我真的希望能够定义类型 UUID
,例如使用如下正则表达式。
export type UUID = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-5][0-9a-f]{3}-[089ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
这是可以预见的吗?
答案 3 :(得分:0)
您可以创建一个仅包含正则表达式字符串的接口。
例如:
export interface UUID {
UUID = "[A-Z0-9]{8}-[A-Z0-9]{4}-[A-Z0-9]{4}-[A-Z0-9]{4}-[A-Z0-9]{12}"
}