是否可以为打字稿中的类型分配部分通配符?

时间:2019-07-13 07:41:37

标签: typescript

我搜索了一会儿,看是否有可能,我什么都找不到,但是也许我想要的是可能的,我只是用错误的搜索词进行了搜索。

我想做什么

type a = 'String' | 'String/' + string;
const b: a = 'String/anything';

1 个答案:

答案 0 :(得分:2)

TypeScript不具有此功能(无论如何从v3.5开始)。现有的suggestion允许使用正则表达式来选择string的子类型。如果实现了该功能,您将可以执行以下操作:

// THE FOLLOWING CODE IS NOT VALID TYPESCRIPT, DO NOT USE
type a = /^String(\/.*)?$/;
const b: a = "String/anything"; // okay

如果您真的想看到这种情况,那么您可能想在GitHub上解决该问题,并给它一个?或描述您的用例,如果您认为它比现有的方法更具吸引力。


您今天可以使用的最接近的解决方法是没有任何编译时验证。您可以使branded primitive代表您的a类型,并使user-defined type guard function在运行时而不是编译时执行验证:

type a = string & { __brand: "type a" };
function isA(x: string): x is a {
  return /^String(\/.*)?$/.test(x);
}

然后您可以像这样定义b

const b = "String/anything";
if (!isA(b)) throw new Error(b + "does not match type a");

,在该代码之后,编译器已知b的类型为a

function acceptOnlyA(a: a) {}
acceptOnlyA(b); // okay

因此,它一直有效。


好的,希望能有所帮助。祝你好运!

Link to code