型が完全一致しないとエラーにする方法です。
そこで、以下のようなExact
というGenericを定義して使います。
type Exact<T, R> = T extends R
? R extends T
? T
: never
: never
type Base = {
b: number
}
type Derived = Base & {
d: number
}
function baseFunc(base: Base) {}
function exactBaseFunc<T = Base>(b: Exact<T, Base>) {}
const base: Base = { b: 1 }
const derived: Derived = { b: 1, d: 2 }
baseFunc(base) // ok
baseFunc(derived) // ok
exactBaseFunc(base) // ok
exactBaseFunc(derived) // error
補足ですが、派生の型に基本の型を入れるとエラーになります。
function derivedFunc(derived: Derived) {}
derivedFunc(base) // error
derivedFunc(derived) // ok
APIやストレージなど、特定のプロパティしか保存したくないという時にこのようにしておくと型でエラーが出るので安心。