xcatliu/typescript-tutorial

数组的类型

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所以不报错呢?

@394104177

@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;
}
这不就是一个函数吗 为什么就成了接口呢 表示不太能理解啊

@pumpkinduan

@394104177

@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
}