【发布时间】:2020-07-03 21:39:33
【问题描述】:
以下代码给了我一个 TypeScript 错误:
type UserID = string & { readonly _: unique symbol };
interface Chat {
name: string
}
type AllChats = Record<UserID, Chat>;
const test: AllChats = {}
const userID = "ads" as UserID;
test[userID] = {
name: "my chat"
}
我将 UserID 用作不透明类型(如此处所述 https://evertpot.com/opaque-ts-types/),因此它充当字符串,但是不能将随机字符串分配给 UserID 类型的变量。
但是,我在最后一行收到以下错误:“元素隐式具有 'any' 类型,因为 'UserID' 类型的表达式不能用于索引类型 'Record
知道为什么我会收到此错误吗?我不明白为什么我不能使用 UserID 类型的东西来索引 Record
更新:根据这个页面https://levelup.gitconnected.com/building-type-safe-dictionaries-in-typescript-a072d750cbdf,看起来我可以通过使用 Javascript Maps 而不是对象来实现我想要的行为。但这意味着放弃 Javascript 提供的所有对象语法,我不想这样做。
UPDATE2:看起来这可能是 Typescript 目前无法处理的已知问题 https://github.com/microsoft/TypeScript/issues/15746
【问题讨论】:
-
在访问之前您需要您的断言,否则不透明将毫无意义。 Iow:创建validUserId函数或者isValidUserId在访问前检查。
-
访问前需要断言是什么意思?
-
如果我已经确定userID是UserID类型,为什么我需要在访问之前再次验证它?
标签: javascript reactjs typescript