定义一个interface,约束对象的value类型为泛型:
interface INumberObj<V>{
[key:string] : V
}
并定义一个对象,用上面创建的约束:
const obj :INumberObj<number> ={
a : 1,
b : 2
}
定义另一个interface,约束对象的key属性名以及value值类型:
interface IObj{
name:string
age:number
}
定义两个type,分别为对象obj和接口IObj的属性联合类型:
type keys = keyof typeof obj
type keys1 = keyof IObj
用这两个type约束创建字符串时,发现keys1
约束的字符串只可以使用name
或者age
,而keys
约束的字符串却没有限制:
const test1 : keys1 = "name"
const test2 :keys = "anystr"
原因是因为keys
类型来源于obj
对象,obj
对被约束为INumberObj
类型,而INumberObj
类型只对属性进行string
约束,所以keys
类型约束的变量可以使用任意字符串