在TypeScript中,某些类型是使用extends keyof
或in keyof
定义的。我试图理解它们的含义,但到目前为止我没有成功succeed
我得到的是,keyof
单独返回一个联合类型,该类型具有所有可能的名称,这些名称作为属性名称存在于keyof
之后指定的类型上。
type T = keyof string;
T
等效于startsWith | endsWith | trim | substring | ...
。
这正确吗?
现在,如果我尝试思考extends keyof
和in keyof
的含义,我的直觉会说:
extends keyof
是从T
派生的任何类型,即它具有所有这些可能的值,但可能更多。in keyof
是从T
中取值的任何类型,但不一定要取全部值(有可能,但可能更少)。因此,从这个POV extends keyof
将描述一个>=
关系,in keyof
将描述一个<=
关系。它是否正确?如果没有,那是正确的吗?
答案 0 :(得分:4)
对于任何类型的T
,keyof T
是T
的已知公共属性名称的并集。
您关于keyof string
产生startsWith | endsWith | trim | ...
的假设是正确的。
您对extends keyof
的假设是不正确的。在这种情况下,extends
用于定义generic parameter的类型,例如<T, K extends keyof T>
。与extending interfaces相反,它与扩展类型或继承无关。
extends keyof
的用法如下:
interface IAnimal {
extinct: boolean;
race: string;
}
function getKeyValue<T, K extends keyof T>(obj: T, key: K) {
return obj[key];
}
const animal: IAnimal = {
extinct: false,
race: "dog"
};
const animalRace = getKeyValue(animal, "race"); // race is a key of IAnimal -> works
const animalAge = getKeyValue(animal, "age"); // age is not a key of IAnimal -> fails
除了documentation之外,我发现this文章很有帮助。
您对in keyof
的假设也是不正确的。 in
没有描述<=
关系,它在定义要使用特定键键入的索引器属性时使用。
例如,我们可以使用它来创建一个新类型,该新类型将现有类型的所有属性重新映射为可选:
type Optional<T> = { [K in keyof T]?: T[K] };
const animal: Optional<IAnimal> = {
extinct: true
};
除了documentation之外,我再次发现this文章很有帮助。