数组的类型
xcatliu opened this issue · 10 comments
上一节不是说:一旦定义了任意属性,那么确定属性和可选属性的类型都必须是它的类型的子集。那为什么
{
[index: number]: number;
length: number;
callee: Function;
},
由于Function不是number的子类型,为什么这个定义不报错呢?
@liantianyun
上一节不是说:一旦定义了任意属性,那么确定属性和可选属性的类型都必须是它的类型的子集。那为什么
{
[index: number]: number;
length: number;
callee: Function;
},
由于Function不是number的子类型,为什么这个定义不报错呢?
是不是因为严格模式下没有callee所以不报错呢?
@liantianyun
上一节不是说:一旦定义了任意属性,那么确定属性和可选属性的类型都必须是它的类型的子集。那为什么
{
[index: number]: number;
length: number;
callee: Function;
},
由于Function不是number的子类型,为什么这个定义不报错呢?是不是因为严格模式下没有callee所以不报错呢?
有一个前提,任意属性的类型为string时,那么确定属性和可选属性的类型都必须为它的类型的子集,这个例子是number类型,所以没有报错,你把任意属性类型换成string就会
@liantianyun
上一节不是说:一旦定义了任意属性,那么确定属性和可选属性的类型都必须是它的类型的子集。那为什么
{
[index: number]: number;
length: number;
callee: Function;
},
由于Function不是number的子类型,为什么这个定义不报错呢?
我试了下是报错对的。但是发现用webstorm的自动编译js,编辑器未报错。如果直接用tsc命令手动编译js则报错。应该对的,以tsc命令为准
@liantianyun
上一节不是说:一旦定义了任意属性,那么确定属性和可选属性的类型都必须是它的类型的子集。那为什么
{
[index: number]: number;
length: number;
callee: Function;
},
由于Function不是number的子类型,为什么这个定义不报错呢?
number
类型的任意属性签名不会影响其他 string
类型的属性签名:
type Arg = {
[index: number]: string
length: number
}
如上,虽然指定了 number
类型的任意属性的类型是 string
,但 length
属性是 string
类型的签名,所以不受前者的影响。
但是反过来就不一样了,如果接口定义了 string
类型的任意属性签名,它不仅会影响其他 string
类型的签名,也会影响其他 number
类型的签名。这一点可以参考两种任意类型签名并存时,number
类型的签名指定的值类型必须是 string
类型的签名指定的值类型的子集这句话。
3楼正解.. index是number类型, 不会检测其他非number类型的key
function sum() {
let args: {
[index: number]: number;
length: number;
callee: Function;
} = arguments;
}
这不就是一个函数吗 为什么就成了接口呢 表示不太能理解啊
@liantianyun
上一节不是说:一旦定义了任意属性,那么确定属性和可选属性的类型都必须是它的类型的子集。那为什么
{
[index: number]: number;
length: number;
callee: Function;
},
由于Function不是number的子类型,为什么这个定义不报错呢?是不是因为严格模式下没有callee所以不报错呢?
有一个前提,任意属性的类型为string时,那么确定属性和可选属性的类型都必须为它的类型的子集,这个例子是number类型,所以没有报错,你把任意属性类型换成string就会
正解
官方文档 太生涩了
@liantianyun
上一节不是说:一旦定义了任意属性,那么确定属性和可选属性的类型都必须是它的类型的子集。那为什么
{
[index: number]: number;
length: number;
callee: Function;
},
由于Function不是number的子类型,为什么这个定义不报错呢?
number
类型的任意属性签名不会影响其他string
类型的属性签名:type Arg = { [index: number]: string length: number }如上,虽然指定了
number
类型的任意属性的类型是string
,但length
属性是string
类型的签名,所以不受前者的影响。但是反过来就不一样了,如果接口定义了
string
类型的任意属性签名,它不仅会影响其他string
类型的签名,也会影响其他number
类型的签名。这一点可以参考两种任意类型签名并存时,number
类型的签名指定的值类型必须是string
类型的签名指定的值类型的子集这句话。
如下, 这样也是不会报错的, 是什么原因呢
interface ClassArray {
[index: string]: number
(length: number): string
}