машинопись я могу переопределить T в массиве <T>в интерфейсе - PullRequest
0 голосов
/ 05 июня 2019

У меня есть файл интерфейса, как показано ниже.

Я хочу переопределить тип 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 ]

2 голосов
/ 05 июня 2019

Непонятно, почему вы хотите использовать дженерики?Если вашему школьному интерфейсу также нужен тип учащегося, вы можете объявить другой интерфейс:

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"
        }
    ]
}
0 голосов
/ 05 июня 2019

Вы можете получить тип школы Student путем поиска свойства "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], это то, что вы называете Student.

Ссылка на код .

Конечно, более обычным является определение Student сначала, а затем определение School в терминах его, поэтому, если вам не нужно , чтобы сначала определить School и извлечь из него Student, Я бы последовал @ совету Кокодоко .

Надеюсь, это поможет. Удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...