【问题标题】:Stricter typing instead of "as" keyword in TypeScriptTypeScript 中更严格的输入而不是“as”关键字
【发布时间】:2021-08-24 03:32:49
【问题描述】:

请看下面的代码:

type Collections = 'Users' | 'Products' | 'Accounts';

// querying a collection
DB.collection('Users' as Collections).doc(docId).get().then(...)

// below I'm misspelling the "Users" as "User" expecting that I'll get an error. But no errors
DB.collection('User' as Collections).doc(docId).get().then(...)

如何在此处强制执行类型检查?

// one way I'm doing that is
const UsersCollectionNameKey: Collections = 'Users';
DB.collection(UsersCollectionNameKey).doc(docId).get().then(...)

这可行,但预先声明所有集合名称变量非常繁琐。我想知道我们是否有一个像is 这样的打字稿关键字,以便它在那里强制执行类型检查?喜欢

DB.collection('Users' is Collection) // no errors
DB.collection('User' is Collection) // Err: User is not assignable to type Collection

【问题讨论】:

  • as 告诉编译器你更了解并且没有编译时或运行时行为来强制执行该类型。如果您有class 实例,则可以使用instanceof。您还可以定义自己的type guards,在运行时工作。
  • 删除了我最后的评论.. 开始明白了。你能改变DB.collection的类型吗?你写/定义了吗?

标签: typescript


【解决方案1】:

x as Y 语法是 type assertion,它告诉 TypeScript 你“知道”x 将始终是 Y 类型。这是为了让您可以在类型系统中引入无法以其他方式推断的信息。

所以

DB.collection('User' as Collections)

你基本上是在告诉 TypeScript 知道'User'Collections,不需要检查这个 - 这与你正在尝试的相反去实现。

相反,您需要告诉 TypeScript DB.collection() 需要 Collections 作为参数,您可以在 该函数的定义中这样做

public collection(name: Collections) {
    // ...
}

使用此 TypeScript 将检查传递的参数是否为 Collections 类型,即是 'Users''Products''Accounts'

DB.collection('Users') // no errors
DB.collection('User') // error: Argument of type '"User"' is not assignable to parameter of type 'Collections'.

请参阅此TS playground 以获取实时示例。

如果您无法更改 DB.collection() 的定义,您可以编写一个包装函数作为解决方法:

function getCollection(name: Collections) {
    return DB.collection(name);
}

getCollection('Users') // no errors
getCollection('User') // error: Argument of type '"User"' is not assignable to parameter of type 'Collections'.

TS playground

【讨论】:

    【解决方案2】:

    由于我在移动设备上,我无法仔细检查这一点,而是将“Users”作为 Collection 将“Users”作为 const。

    as const 将停止将“Users”扩展为字符串,因此您无需将其转换回较窄的联合

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-29
      • 2021-09-21
      • 1970-01-01
      • 2021-12-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多