Проще говоря ... если интерфейс говорит, что вы можете передать строку ИЛИ число, то при реализации этого интерфейса ... эта функция также должна иметь возможность получать строку или число.
Если реализация вашего интерфейса уменьшает тип с string | number
до string
или просто number
, это нарушает контракт.
, поэтому невозможно делай то, что я делаю
Сложно сказать, потому что твой пример очень искусственный и, вероятно, не отражает того, что ты на самом деле пытаешься сделать.
Идея использования интерфейса заключается в том, что что-то еще может получить экземпляр этого интерфейса и быть уверенным, что они могут выполнять вашу функцию со строкой или числом. Очевидно, что это не так для вашего случая, потому что myVariable
принимает только число, а myVariable2
принимает только строку.
Возможно express интерфейс следующим образом:
interface InterfaceTest {
input?: (test: number) => number | undefined | (test: string) => number | undefined;
}
Этот интерфейс заявляет, что если существует input
, он должен иметь реализацию любой из этих функций, но вы тоже столкнетесь с этой проблемой, потому что теперь нелегко выяснить, если реализация Ваш интерфейс имеет вид number
или string
.
Это может означать защиту типа или утверждение типа.
Но вернемся к исходной точке, я думаю, что пример немного бессмысленный , Какова цель интерфейса? Почему это вообще интерфейс?
При каких обстоятельствах нужно иметь возможность заменить myVariable
на myVariable2
.
Удаление интерфейса, очевидно, работает, поэтому должен быть причина, по которой вы используете интерфейс:
const myVariable = {
input: (test: number) => {
return test;
},
};
const myVariable2 = {
input: (test: string) => {
return parseInt(test, 2);
},
};
Существует один способ решения этой проблемы, но я не решаюсь предложить это, так как беспокоюсь, что, возможно, вы не используете интерфейс по правильной причине.
Но вот оно:
Скажем, ваш InterfaceTest
имеет много функций и может иметь функцию input
. Но в основном есть 2 варианта InterfaceTest
, есть один вариант, который работает только с числами, и есть один, который работает только со строками.
Версия вашего примера generi c будет выглядеть так:
interface InterfaceTest<T> {
input?(test: T): number | undefined;
}
const myVariable: InterfaceTest<number> = {
input: (test: number) => {
return test;
},
};
const myVariable2: InterfaceTest<string> = {
input: (test: string) => {
return parseInt(test, 2);
},
};