据我们所知,打字稿允许我们声明部分类型,但是当我们要检查我的属性是否在Typeof中时会怎样呢? 让我们看看
interface Car {
Brand: string;
Model: string;
}
type KeyofCar = keyof Car; // Brand, Model
if('Brand' is in KeyofCar) {
something...
} // I know it doesn't work but it is pseudocode
有什么办法找出答案吗?
答案 0 :(得分:1)
我不确定您要在这里做什么。在您的问题中,您知道在编译时'Brand'
中的keyof Car
是。那你为什么要检查呢?
我可以想象如果类型不是完全未知的,那么尝试做类似的事情,例如在类型参数中……
function<T>(foo: T) {
if('bar' in keyof T) {
// do something...
}
}
我想说您不会尝试通过将某些内容与keyof T
进行比较来解决该问题。而是尝试做这样的事情
interface Car {
Brand: string;
Model: string;
}
interface Bus {
Passengers: number;
Color: string;
}
function(foo: Car | Bus) {
if('Brand' in foo) {
// foo is a Car
} else {
// foo is a Bus
}
}
如果您真的想使用按键来做某事,则可以做这样的事
type CarKey = keyof Car;
const carKeys: CarKey[] = ['Brand', 'Model'];
function(key: string) {
if(carKeys.includes(key)) {
// do thing
}
}
答案 1 :(得分:0)
在撰写本文时,还没有一种方法可以在运行时严格使用Typescript机制进行检查。尽管您可以做的是一个丑陋的骇客,但是您可以创建一个Record,然后从中提取密钥。
interface Car {
Brand: string;
Model: string;
}
const carRecord: Record<keyof Car, boolean> = {
Brand: true,
Model: true
}
if (carRecord['Brand']) {
something...
}
执行Record
的原因是因为每次更改界面时,还必须更改Record
。否则,Typescript将抛出编译错误。至少这可以确保随着Car
接口的增长,检查将保持一致。
答案 2 :(得分:0)
type CheckPropExists<T extends {[x:string]:any},Prop extends string> = T[Prop] extends undefined ? false : true;
//Example
type Result = CheckPropExists<{a:string;b:number;},"a">;
//Result is true