Другие ответы здесь верны, но я хочу добавить, что вы можете рассмотреть возможность использования универсальных параметров по умолчанию , если вы обычно (но не всегда) просто передаете FooOptions<T>
в качестве типа O
interface FooOptions<T> {
doSomething: (e: T) => void;
}
// note how O has a default value now
export interface FooInterface<T, O extends FooOptions<T> = FooOptions<T>> {
items: T[];
options: O;
}
Это позволяет вам просто пропустить параметр O
, когда вы намереваетесь установить значение FooOptions<T>
:
const t: FooInterface<string> = {
items: ["a", "b", "c"],
options: {
doSomething: (e) => {
console.log(e);
}
}
}
И в том случае, если вы действительно хотите, чтобы O
был более конкретным, чем FooOptions<T>
(вот почему он у вас есть в качестве отдельного параметра, верно?), Вы все равно можете сделать это:
interface MoreOptions {
doSomething: (e: string) => void;
doNothing: () => void;
}
const u: FooInterface<string, MoreOptions> = {
items: ["d", "e", "f"],
options: {
doSomething(e) { console.log(e); },
doNothing() { console.log("lol nvm"); }
}
}
О, и если T
обычно будет string
, тогда вы можете добавить для него значение по умолчанию, и тогда FooInterface
без параметров будет интерпретироваться как FooInterface<string, FooOptions<string>>
:
export interface FooInterface<T = string, O extends FooOptions<T> = FooOptions<T>> {
items: T[];
options: O;
}
const t: FooInterface = {
items: ["a", "b", "c"],
options: {
doSomething: (e) => {
console.log(e);
}
}
}
Хорошо, надеюсь, это поможет. Удачи!