typescript - 阻止对象中某种类型的值
问题描述
我有一个类型SecretString
可以包含我可以在我的服务器上处理但我不想意外注销的任何类型的敏感信息。这是一个品牌字符串类型:
type SecretString = string & {__brand: "secret"}
我的日志记录函数需要一个字符串和一个对象(any
当前),其中可以包含任何可能需要的附加信息。有没有办法让我将第二个参数表示为可以是任意对象但如果SecretString
存在 a 会抱怨的类型?嵌套检查会很棒,但我会对第一级感到满意。
由于它的SecretString
工作原理就像一个字符串,它通常来自这样的函数:
function decryptString(encryptedString: EncryptedString): SecretString {
// ...
}
所以这是我想要一条错误消息的场景示例:
const keys = decryptString(encryptedKeys);
logger.info('This should not compile!', {
valueThatIsOk: 'this is ok',
valueThatShouldFail: keys
});
解决方案
目前,递归超出了我的 TypeScript,但在顶层,映射类型应该可以工作:
type SecretString = string & {__brand: "secret"};
function log<ObjType>(msg: any, obj: ObjType extends SecretString ? never : ObjType) {
console.log(msg, obj);
}
let x: SecretString = "example" as SecretString;
log("hi", {example: 42});
log("hi", "more info");
log("hi", x);
// ^−−−−−−−−−−−−−−− error as desired
对于传递一个对象,它仍然是同一件事,但在一个对象结构中:
function log<ObjType extends object>(
msg: any,
obj: {[key in keyof ObjType]: ObjType[key] extends SecretString ? never : ObjType[key]}
) {
console.log(msg, obj);
}
(如果你想要两者,你可以将它们组合成一个联合体。)
推荐阅读
- inversion-of-control - Windows 社区工具包 IoC :: 是吗 || 是否能够添加其他供应商或自己的 IoC 模块?
- javascript - Javascript Hangman Game 仅填充单词中第一次出现的重复字母
- django - 不同组织中的Django相同的用户名
- c++ - 如何向向量添加类函数(即“nortmalVector.customFunction()”)
- python - cygwin 上的 PyInstaller
- json - 如何使用 Oracle 解析没有元素/属性名称的 JSON 数组
- common-lisp - 仅获取 plist 的键
- xcopy - xcopy 到文件而不是目录,可以反转吗?
- tensorflow - 连体多层感知器
- haskell - Haskell中的模棱两可的类型变量问题