gpt4 book ai didi

TypeScript 如何区分引用相同类型的类型别名

转载 作者:行者123 更新时间:2023-12-03 20:30:08 25 4
gpt4 key购买 nike

例如,当我写:

type Email = string
type Password = string

const returnsEmail = (): Email => 'email@example.com' as Email
const returnsPassword = (): Password => 'P4ssw0rd' as Password

const email1: Email = 'email@example.com' // OK
const email2: Email = returnsEmail() // OK
const email3: Email = returnsPassword() // should not be OK but silent

TypeScript 2.8.3 在这里似乎没有发出任何错误。这是预期的行为吗? TypeScript 的“别名”只是“宏”?我知道 TypeScript 只处理静态类型而不处理验证(各种正则表达式匹配,在上面的情况下),但我认为这是前者的业务,应该完成,特别是如果显式编写注释。

最佳答案

是的,这是预期的行为,正是因为这个原因,类型别名被称为“别名”——它不会创建一个新的不同类型。

此外,您可能会感到惊讶,但在 TypeScript 中,有两个不同的 类型 如果它们具有相同的定义,则可以互换,称为 structural typing :

interface Person {
name: string;
}

interface Pet {
name: string;
}

const p: Pet = {name: 'Rosie'};

const person: Person = p; // no error

目前(直到将名义类型添加到 TypeScript 之前),人们不得不诉诸各种技巧来人为地使类型不兼容。一种这样的技巧叫做' branded types ' ( example here ),它通过向代码中从未使用过的类型添加表面属性来工作,它只会使类型与其他任何东西不兼容:
type Email = string & { __emailBrand: any };
type Password = string & { __passwordBrand: any };

const returnsEmail = (): Email => 'email@example.com' as Email
const returnsPassword = (): Password => 'P4ssw0rd' as Password

const email1: Email = 'email@example.com' as Email;//has to use type assertion here
const email2: Email = returnsEmail() // OK
const email3: Email = returnsPassword() // error

关于TypeScript 如何区分引用相同类型的类型别名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50300710/

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