Специальной функции, которую вы ищете, например, «аннотации типов для произвольных выражений», в TypeScript не существует. Я только что искал существующий запрос функции в GitHub, но я не могу найти его. Либо его там нет, либо мои силы поиска недостаточно сильны.
Здесь есть несколько способов, каждый со своими проблемами.
Как вы уже видели, проще всего использовать утверждение типа . Это работает, чтобы не дать вам ввести совершенно не связанный тип:
// assertion
someFunction({ foo: "bar" } as ITestInterface); // okay as expected
someFunction({ unrelatedThing: 1 } as ITestInterface); // error as expected
Он также позволяет использовать дополнительные свойства (которые по-прежнему безопасны и безопасны для типов, объект типа ITestInterface
не гарантирует не других свойств ... это может вас удивить, потому что вы ожидаете проверка избыточного свойства , но это случается только когда-нибудь):
someFunction({ foo: "bar", hello: true } as ITestInterface); // okay by design,
// excess properties are allowed
Но главное, что здесь важно, - утверждения типа позволяют небезопасно сужать типы, поэтому следующее не будет ошибкой:
someFunction({} as ITestInterface); // no error ?! assertions also NARROW types
Другой путь, по которому вы могли бы пойти, - создать вспомогательную функцию с именем isType
, например:
// helper function
const isType = <T>(x: T) => x;
Это ведет себя почти так же, как вы хотели бы:
someFunction(isType<ITestInterface>({ foo: "bar" })); // okay as expected
someFunction(isType<ITestInterface>({ unrelatedThing: 1 })); // error as expected
someFunction(isType<ITestInterface>({ foo: "bar", hello: true })); // error as you want
someFunction(isType<ITestInterface>({})); // error as everyone wants
Но, как вы сказали, это может не стоить этого для вас. Большинство исполняющих движков будут счастливо встроены в функции, такие как x => x
, поэтому я не думаю, что это проблема производительность . Но это может быть проблемой элегантности, которая зависит от вас.
В любом случае, это лучшее, что я могу сделать. Надеюсь, это поможет. Удачи!
Ссылка на код