Нет необходимости проверять тип {name: "test"} as const
, потому что Typescript использует структурное равенство, поскольку {name: "test"} as const
- это та же структура MyType, что они будут равны и, следовательно, одинаковы.
Такое поведение может бытьнаблюдается с использованием этих вспомогательных типов.
interface MyType {
name: string;
}
const test = {name: "test"} as const;
type IsEqual<T, U> = [T] extends [U] ? true : false;
type AreTheyEqual = IsEqual<typeof test, MyType> // true they are the same.
Все, что принимает MyType, может пройти тест typeof.
РЕДАКТИРОВАТЬ: Если вы хотите, чтобы test типа MyType был принудительно проверен на проверку типа.там вы не можете сделать это, сохранив строковый литерал, потому что все, что заявлено как MyType, потеряет литеральный тип и вернется к строковому, это поведение можно наблюдать здесь.
type MyType = {name: string};
const x:MyType = {
name: 'test' as const
}
type Test = typeof x["name"] // string;
То есть, если вы хотите иметь оба Literalи строковые типы в MyType, вам нужно будет сделать что-то вроде этого (изменение MyType).Обратите внимание, что использование этого может показаться многословным, но, возможно, менее стандартным, чем «as const»
interface MyType<NAME extends string = string> {
name: NAME;
}
const x: MyType = {
name: 'test' // string;
}
const y: MyType<"test"> = {
name: "test" // "test"
}
type Test1 = typeof x["name"]// string;
type Test = typeof y["name"] // "test";
^ Допустимы как строковые, так и литеральные типы.