gpt4 book ai didi

Typescript - 如何禁止两种解析为相同类型的类型别名互换使用?

转载 作者:行者123 更新时间:2023-12-04 00:57:04 24 4
gpt4 key购买 nike

假设我有两个或多个类型别名,例如:

declare type A = string;
declare type B = string;

我有这些类型的变量,以及对它们进行操作的函数。
const a1: A = "example of a";
const b1: B = "example of b";

function withA(a: A){
console.log(a);
}

function withB(b: B){
console.log(b);
}

我希望以下代码出错,但不会:
withA(b1);
withB(a1);

我怎样才能做到这一点?我还需要能够用字符串初始化变量(我假设是强制转换)。但是,一旦初始化,我不希望这些类型“隐式等效”,并且希望编译器禁止它们的互换使用。

我也不想使用类,如下所述:
TypeScript - specific string types

最佳答案

顾名思义,类型别名不会向它们别名的类型添加任何内容。因此,就 TS 而言,AB是同一类型,即 string .

您可以做的是使用品牌类型。这是一种技术,您可以使用基本类型(在本例中为 string)并将其与具有属性的对象类型相交,从而使该类型在结构上与编译器的任何其他内容不兼容。该属性不需要在运行时存在,它只是作为编译器的标记存在:

type A = string & { __brand: "A"};
type B = string & { __brand: "B"};

const a1: A = makeA("example of a");
const b1: B = makeB("example of b");

function makeA(s: string) {
return s as A
}
function makeB(s: string) {
return s as B
}
function withA(a: A){
console.log(a);
}

function withB(b: B){
console.log(b);
}

withA(b1); // error
withB(a1); // error

实用函数 makeAmakeB不是绝对必要的,您可以在分配 string 时使用类型断言,但它们使 DX 变得更好。

备注 :有两种在类型系统( Structural tag type brandsNominal unique type brands )中形式化这种技术的建议,但在撰写本文时都没有合并,也许在 future 的 TS 版本中我们会得到其中一个。

关于Typescript - 如何禁止两种解析为相同类型的类型别名互换使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61619809/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com