如何使用Typescript基于值创建动态类型

如何使用Typescript基于值创建动态类型,typescript,Typescript,我正在构建一个React组件,该组件将根据用户传递的属性使用不同的HTML标记。下面是一个例子: 接口公共{ 普通?:数字; } 接口A扩展了公共{ 第一:字符串; 第二:字符串; 检查:正确; } 接口B扩展了公共{ 第三:字符串; 第四:字符串; 检查?:假; } 型式试验=A | B; 为了测试这一点,我期待以下内容: //成功 让测试:测试={ 共同点:1, 检查:正确, 第一:“文本” } //成功 让测试:测试={ 共同点:1, 检查:错误, 第三:“文本” } //失败 让测试:

我正在构建一个React组件,该组件将根据用户传递的属性使用不同的HTML标记。下面是一个例子:

接口公共{
普通?:数字;
}
接口A扩展了公共{
第一:字符串;
第二:字符串;
检查:正确;
}
接口B扩展了公共{
第三:字符串;
第四:字符串;
检查?:假;
}
型式试验=A | B;
为了测试这一点,我期待以下内容:

//成功
让测试:测试={
共同点:1,
检查:正确,
第一:“文本”
}
//成功
让测试:测试={
共同点:1,
检查:错误,
第三:“文本”
}
//失败
让测试:测试={
共同点:1,
检查:正确,
第三:“文本”
}
//失败
让测试:测试={
共同点:1,
检查:错误,
第一:“文本”
}
所有这些都在起作用,挑战是在根本不传递值进行检查的情况下获得类型B,如:

let测试:测试={
共同点:1,
第一个:“text”//应该突出显示一个错误,因为没有传递'check'
第三:“文本”,
}
以下是我尝试过的:

//尝试1:包含可能的值
接口B扩展了公共{
第三:字符串;
第四:字符串;
检查?:false | null | undefined | never | unknown | void;//都试过了
}
//尝试2:根本不包括。还是不行
接口B扩展了公共{
第三:字符串;
第四:字符串;
}

因为检查在两个接口之间很常见。为什么不呢

interface Common {
    common?: number;
    check?: boolean;
}


interface A extends Common {
    first?: string;
    second?: string;
}

interface B extends Common {
    third?: string;
    fourth?: string;
}

type Test = A | B;

相反?

这是因为
A | B
包含或,但您需要。您可以使用。

为什么会出错<代码>测试obj符合B接口。您可以执行:
check:false、
来区分这两个接口。@r3dst0rm无论何时将
true
false
传递到
检查
,它都会工作。但我面临的问题是,当我甚至没有传递
check
的值时,我想推断它是类型B。我尝试了以下方法:
check:false | undefined
,因为值未传递,所以它是未定义的。但是它不起作用如果你把支票从B中全部删除怎么办?区分这两个的方法是看支票是否存在?它在
A
中是必需的,而在
B
中不是。您有效地删除了
检查
。他所有的测试用例都不工作了。