Typescript:创建一个从原始类型扩展的类型?

时间:2018-03-21 10:51:55

标签: angularjs string typescript types primitive

在我的角度项目中,我想创建一个从字符串扩展的自定义类型。我的情况是我想创建一个" 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;

1 个答案:

答案 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

您需要定义一个辅助函数来创建该类型的实例或使用强制转换,但如果您传递一个简单的字符串,调用站点将会出错。

article对该主题进行了更多讨论。 typescript编译器也将此方法用于paths