首页 > 解决方案 > 是否可以将部分通配符分配给打字稿中的类型?

问题描述

我搜索了一段时间,看看是否可能,我找不到任何东西,但也许我想要的是可能的,我只是用错误的搜索词搜索。

我想做的事

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

标签: typescript

解决方案


TypeScript 没有此功能(无论如何,从 v3.5 开始)。有一个现有的建议允许使用正则表达式来挑选string. 如果实现了,您将能够执行以下操作:

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

如果您真的想看到这种情况发生,您可能需要转到 GitHub 中的那个问题并给它一个或描述您的用例,如果您认为它比现有的更引人注目。


您今天可以使用的最接近的解决方法是没有任何编译时验证。您可以制作一个品牌原语来代表您的a类型,以及一个用户定义的类型保护函数来在运行时而不是编译时执行验证:

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

这样就可以了。


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

链接到代码


推荐阅读