gpt4 book ai didi

typescript - 强制正确使用属性(property)

转载 作者:搜寻专家 更新时间:2023-10-30 21:19:32 26 4
gpt4 key购买 nike

假设我有一个类型,它代表一个用户及其登录名和名字:

export interface User {
login: string;
name: string;
}

现在我想使用该用户的登录名查询 API:

const formatLogin (login: string) => login.toLowerCase().trim();
const getUser = (login: string) => ajax(`${API}/users/${formatLogin(login)}`);

这行得通。稍后在我的代码中我可能会使用:

getUser(this.user.name);

但是这是一个错误。它应该是 this.user.login。它们都是字符串,所以 TypeScript 不会提示。

有没有办法强制使用 TypeScript 使用属性?

我已经尝试过使用 export type Username = string 但这不起作用,因为 name 仍然满足该类型,因为它只是一个 string .我还尝试了 export interface Username {},它不适用于 formatLogin,它需要字符串方法 toLowerCasetriminterface Username extends String{} 有同样的问题。

最佳答案

一种方法是使用所谓的 branded types ,遵循 TypeScript compiler itself 来源中设置的示例:

export type LoginString = string & { __loginBrand: any};

export interface User {
login: LoginString;
name: string;
}


const formatLogin = (login: string) => login.toLowerCase().trim();
const getUser = (login: LoginString) => { };

let user: User;

formatLogin(user.login); // ok
getUser(user.name); // error

您必须手动将普通字符串转换为 LoginString初始化时键入 User对象,您不必为 __loginBrand 提供实际值- 仅用于类型检查。

@estus 也建议使用另一种方法,即使用解构对象作为 API 的一种命名参数。它没有进行类型检查,但任何不匹配都非常明显,前提是所有名称在任何地方都一致使用:

   export interface GetUser {
login: string;
}
const getUser = ({login}: GetUser) => {}

getUser(user); // ok
getUser({login: user.name}); // huh?

关于typescript - 强制正确使用属性(property),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48758472/

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