typescript-tutorial icon indicating copy to clipboard operation
typescript-tutorial copied to clipboard

数组的类型

Open xcatliu opened this issue 4 years ago • 10 comments

https://ts.xcatliu.com/basics/type-of-array.html

xcatliu avatar Jun 08 '20 12:06 xcatliu

上一节不是说:一旦定义了任意属性,那么确定属性和可选属性的类型都必须是它的类型的子集。那为什么 { [index: number]: number; length: number; callee: Function; }, 由于Function不是number的子类型,为什么这个定义不报错呢?

liantianyun avatar Jul 16 '20 15:07 liantianyun

@liantianyun 上一节不是说:一旦定义了任意属性,那么确定属性和可选属性的类型都必须是它的类型的子集。那为什么 { [index: number]: number; length: number; callee: Function; }, 由于Function不是number的子类型,为什么这个定义不报错呢?

是不是因为严格模式下没有callee所以不报错呢?

394104177 avatar Jul 22 '20 16:07 394104177

@394104177

@liantianyun 上一节不是说:一旦定义了任意属性,那么确定属性和可选属性的类型都必须是它的类型的子集。那为什么 { [index: number]: number; length: number; callee: Function; }, 由于Function不是number的子类型,为什么这个定义不报错呢?

是不是因为严格模式下没有callee所以不报错呢?

有一个前提,任意属性的类型为string时,那么确定属性和可选属性的类型都必须为它的类型的子集,这个例子是number类型,所以没有报错,你把任意属性类型换成string就会

pumpkinduan avatar Jul 27 '20 09:07 pumpkinduan

@liantianyun 上一节不是说:一旦定义了任意属性,那么确定属性和可选属性的类型都必须是它的类型的子集。那为什么 { [index: number]: number; length: number; callee: Function; }, 由于Function不是number的子类型,为什么这个定义不报错呢?

我试了下是报错对的。但是发现用webstorm的自动编译js,编辑器未报错。如果直接用tsc命令手动编译js则报错。应该对的,以tsc命令为准

xiudaozhe avatar Jul 29 '20 08:07 xiudaozhe

@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 类型的签名指定的值类型的子集这句话。

suukii avatar Jul 30 '20 07:07 suukii

3楼正解.. index是number类型, 不会检测其他非number类型的key

JacquesYW avatar Nov 17 '20 02:11 JacquesYW

function sum() { let args: { [index: number]: number; length: number; callee: Function; } = arguments; } 这不就是一个函数吗 为什么就成了接口呢 表示不太能理解啊

ggg1it avatar Feb 03 '21 03:02 ggg1it

@pumpkinduan

@394104177

@liantianyun 上一节不是说:一旦定义了任意属性,那么确定属性和可选属性的类型都必须是它的类型的子集。那为什么 { [index: number]: number; length: number; callee: Function; }, 由于Function不是number的子类型,为什么这个定义不报错呢?

是不是因为严格模式下没有callee所以不报错呢?

有一个前提,任意属性的类型为string时,那么确定属性和可选属性的类型都必须为它的类型的子集,这个例子是number类型,所以没有报错,你把任意属性类型换成string就会

正解

ClishWang avatar Feb 24 '21 08:02 ClishWang

官方文档 太生涩了

xyp-null avatar Apr 16 '21 08:04 xyp-null

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

abb-uu avatar Sep 08 '21 09:09 abb-uu