Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

数组的类型 #157

Open
xcatliu opened this issue Jun 8, 2020 · 10 comments
Open

数组的类型 #157

xcatliu opened this issue Jun 8, 2020 · 10 comments

Comments

@xcatliu
Copy link
Owner

xcatliu commented Jun 8, 2020

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

@liantianyun
Copy link

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

@394104177
Copy link

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

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

@pumpkinduan
Copy link

@394104177

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

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

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

@xiudaozhe
Copy link

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

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

@suukii
Copy link

suukii commented Jul 30, 2020

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

@JacquesYW
Copy link

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

@ggg1it
Copy link

ggg1it commented Feb 3, 2021

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

@ClishWang
Copy link

@pumpkinduan

@394104177

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

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

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

正解

@xyp-null
Copy link

官方文档 太生涩了

@abb-uu
Copy link

abb-uu commented Sep 8, 2021

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests