Частичный тип возвращаемого значения функции не такой строгий, как ожидалось - PullRequest
0 голосов
/ 27 апреля 2018

Я пытаюсь выполнить строгую проверку типа функции (A), передаваемой в параметре другой функции. Возвращаемое значение A должно быть Partial данного интерфейса.

Итак, учитывая следующий интерфейс:

interface IUser {
    name: string;
    age: number;
}

Я хочу, чтобы TypeScript выдавал ошибку, если возвращаемое значение функции не является Partial этого интерфейса

function check(f: () => Partial<IUser>) {
    return f; // implementation of this function is pointless, only the type checking here interests me
}

При возврате объекта, который не содержит ни одного ключа интерфейса, TS выдает ошибку, которая ожидается.
Но когда на возвращаемом объекте есть хотя бы один из ключей IUser, ошибки больше нет, это неожиданно

check(() => ({ foo: 'bar' })); // GOOD - Type '{ foo: 'bar' }' has no properties in common with type 'Partial<IUser>'.

check(() => ({ foo: 'bar', name: 'Dar' })); // BAD - no error

Я не могу понять, почему TS не выдает ошибку, потому что при попытке создать объект типа Partial<IUser> с дополнительным свойством выдается ошибка.

const o: Partial<IUser> = {
    name: 'Dar',
    foo: 'bar',
}; // Object literal may only specify known properties, and 'foo' does not exist in type 'Partial<IUser>'.

Есть ли способ заставить TS выдать ошибку при использовании обратного вызова, подобного этому?

Примечание: тесты выполнены с использованием TypeScript 2.8.1

1 Ответ

0 голосов
/ 27 апреля 2018

Хотя я не уверен, что у меня есть точный ответ, я считаю, что это поведение, присущее TypeScript, а не то, как вы использовали Partials.

Частицы определены в спецификации TypeScript следующим образом:

type Partial<T> = {
    [P in keyof T]?: T[P];
}

В качестве проверки работоспособности я переписал ваш код с использованием явного слабого типа (см. Критическое изменение в TypeScript 2.4 ) вместо частичного, и я получил тот же результат .

Мне удалось найти эту проблему в репозитории TypeScript: интерфейс функции не проверяет возвращаемое значение для дополнительных ключей . Похоже, что тип автоматически не выводится из подписи check. Похоже, это связано со свежестью литерала объекта, и проблема не решена (как вы можете видеть из обсуждения этой проблемы).

Хорошая новость заключается в том, что, похоже, есть способ применить его вручную. Для этого вы можете включить следующее:

check((): Partial<IUser> => ({ foo: 'bar', name: 'Dar' }));

Теперь это создаст ошибку, аналогичную назначению внизу: Object literal may only specify known properties, and 'foo' does not exist in type 'Partial<IUser>'. Вы можете увидеть это на детской площадке здесь .

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