我可以在接口中的Array <T>中重新定义Typescript吗

时间:2019-06-05 10:07:02

标签: typescript interface

我有一个如下所示的接口文件。

我想使用该界面重新定义Student类型。

export interface School{
    name: string;
    student: {
        student_id: number;
        student_name: string;
    }[];
}

type Student = ... (student_id: number, student_name)

所以,我尝试了这个:

type Student = Pick<School, "student">["student"]
==>
#Student = {
#   student_id: number;
#   student_name: string;
#}[]

但这是一个数组,而不是通用数组。

在这种情况下,如何定义学校对象?

2 个答案:

答案 0 :(得分:2)

不清楚为什么要使用泛型?如果您的学校界面也需要学生类型,则可以声明另一个界面:

interface School {
    name: string;
    students: Student[];
}

interface Student {
    student_id: number;
    student_name: string;
}

let s:School = {
    name:"too cool for school",
    students: [
        { 
           student_id:3,
           student_name:"Joe"
        }
    ]
}

答案 1 :(得分:0)

您可以通过looking up Student的{​​{1}}属性(它是数组类型),然后选择"student"属性来获得School类型的学校像这样的数组类型:

number

如果export interface School { name: string; student: { student_id: number; student_name: string; }[]; } type Student = School["student"][number]; // type Student = { // student_id: number; // student_name: string; // } 使您感到困惑,请想象您有一个number类型的变量school,一个字符串文字类型School的变量studentKey ,以及类型为"student"的变量numberKey

number

然后,您期望declare const school: School; declare const studentKey: "student"; declare const numberKey: number; 将是school[studentKey][numberKey]

Student

const student: Student = school[studentKey][numberKey]; // okay 的类型仅为school[studentKey][numberKey],这就是您所说的School["student"][number]

Link to code

当然,首先定义Student然后再根据其定义Student更为常规,因此除非您需要首先定义School并提取School,我会关注@Kokodoko's advice

希望有帮助。祝你好运!