TypeScript: «как const» в сочетании с типом? - PullRequest
1 голос
/ 21 июня 2019

Я хочу объединить оба, имеющие тип для константы, и использовать его "как const", чтобы получить литеральные типы как тип ... как мне это сделать?

type MyType = {name: string};

const x:MyType = {
    name: 'test' // Autocompleted, typesafe. But Type is {name: string}, not 
                 // what I want, {name: 'test'}
}

const x = { name: 'test' } as const; // Gives correct type, but no type check...

1 Ответ

1 голос
/ 21 июня 2019

Нет необходимости проверять тип {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";

^ Допустимы как строковые, так и литеральные типы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...