首页 > 解决方案 > 阻止对象中某种类型的值

问题描述

我有一个类型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

解决方案


目前,递归超出了我的 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);
}

游乐场链接

(如果你想要两者,你可以将它们组合成一个联合体。)


推荐阅读