07 # 接口:对象类型接口

接口定义

interface List {
    
    
    id: number;
    name: string;
}

interface Result {
    
    
    data: List[];
}

function render(result: Result) {
    
    
    result.data.forEach(value => {
    
    
        console.log(value.id, value.name);
    })
}

let result = {
    
    
    data: [
        {
    
     id: 1, name: 'a' , sex: "male"},
        {
    
     id: 2, name: 'b' },
        {
    
     id: 3, name: 'c' },
    ]
};

render(result);

如果传入对象字面量的话,ts 会对额外的字段进行类型检查,sex 就会报错

render({
    
    
    data: [
        {
    
     id: 1, name: 'a' , sex: "male"},
        {
    
     id: 2, name: 'b' },
        {
    
     id: 3, name: 'c' },
    ]
})

绕过这种检查的方法一共有三种

第一种:就是上面赋值给一个变量,然后传入

第二种:使用类型断言(明确告诉编译器我们的类型就是 Result,这样编译器就会绕过检查)

render({
    
    
    data: [
        {
    
     id: 1, name: 'a' , sex: "male"},
        {
    
     id: 2, name: 'b' },
        {
    
     id: 3, name: 'c' },
    ]
} as Result);

或者使用 <Result>,建议使用 as,这种在 react 中会产生歧义

render(<Result>{
    
    
    data: [
        {
    
     id: 1, name: 'a' , sex: "male"},
        {
    
     id: 2, name: 'b' },
        {
    
     id: 3, name: 'c' },
    ]
});

第三种:使用字符串索引签名:用任意的字符串去索引 List

interface List {
    
    
    id: number;
    name: string;
    [x: string]: any;
}

接口成员属性

可选属性

interface List {
    
    
    id: number;
    name: string;
    // [x: string]: any;
    age?: number;
}

interface Result {
    
    
    data: List[];
}

function render(result: Result) {
    
    
    result.data.forEach(value => {
    
    
        console.log(value.id, value.name);
        if(value.age) {
    
    
            console.log(value.age);
        }
    })
}

let result = {
    
    
    data: [
        {
    
     id: 1, name: 'a' , sex: "male"},
        {
    
     id: 2, name: 'b' },
        {
    
     id: 3, name: 'c' },
    ]
};

render(result);

只读属性:不容许修改

interface List {
    
    
    readonly id: number;
    name: string;
    // [x: string]: any;
    age?: number;
}

interface Result {
    
    
    data: List[];
}

function render(result: Result) {
    
    
    result.data.forEach(value => {
    
    
        console.log(value.id, value.name);
        if(value.age) {
    
    
            console.log(value.age);
        }
        value.id++; // 无法为“id”赋值,因为它是只读属性。
    })
}

let result = {
    
    
    data: [
        {
    
     id: 1, name: 'a' , sex: "male"},
        {
    
     id: 2, name: 'b' },
        {
    
     id: 3, name: 'c' },
    ]
};

render(result);

不确定一个接口中有多少属性时,就可以使用可索引类型的接口,可以用数字跟字符串去索引。

用数字索引的接口:

interface StringArray {
    
    
    [index: number]: string;
}

let chars: StringArray = ["A", "B"];

用字符串索引的接口:

interface Names {
    
    
    [x: string]: string;
    // y: number // 类型“number”的属性“y”不能赋给“string”索引类型“string”。
    // 混用
    [y: number]: string;
}

猜你喜欢

转载自blog.csdn.net/kaimo313/article/details/134792698
07