在我的角度项目中,我想创建一个从字符串扩展的自定义类型。我的情况是我想创建一个" ID"用于将字符串与idstring分开。
let str = String("tutu");
let id = ID("ec1s69azs");
this.service.getUserById(str) => doesn't compile;
this.service.getUserById(id) => compile;
将来,我可能想在" ID"中添加id验证器。型
我想知道它是否可能,因为我已经尝试了许多" hacks"但没有人能给我我想要的结果。
class ObjectID extends String {
}
export type ID = ObjectID;
或
interface StringConstructor {
new(value?: any): String;
(value?: any): string;
readonly prototype: String;
fromCharCode(...codes: number[]): string;
}
export type ID = StringConstructor;
答案 0 :(得分:0)
不要认为您需要扩展string
,您可以使用品牌类型来实现所需的结果。
type ObjectID = string & { __type: 'Id'}
function ID(n: string): ObjectID{
return n as any;
}
// Usage
function getUserById(id: ObjectID) {
}
getUserById(ID("1")); //ok
getUserById("1"); // error
您需要定义一个辅助函数来创建该类型的实例或使用强制转换,但如果您传递一个简单的字符串,调用站点将会出错。