Машинопись.Почему описанный тип «возвращаемого значения» в функциональном интерфейсе не является строго реализованным? - PullRequest
1 голос
/ 06 июня 2019

Я попытался описать функциональный интерфейс с определенным частичным типом возвращаемого значения в одном месте.

Мой интерфейс IStore содержит только одно свойство test.Если я устанавливаю свой интерфейс на какую-то функцию foo, которая возвращает хэш-карту также с другими свойствами, машинопись говорит "все в порядке".Но мне нужно получить ошибку TS, в то время как возвращаемое значение из foo не строго соответствует Partial<IStore>.Без явного указания возвращаемое значение на foo

interface IStore {test: string;}
type IFunction<S> = (store: S) => Partial<S>;

// no ts errors. WHY?
// that's NO OK for me.
const foo1: IFunction<IStore> = () => ({
  test: '',
  test2: '' // why no errors in this row?
});

// ts error,
// it is working, but not my target case
const foo2: IFunction<IStore> = (): IStore => ({
  test: '',
  test2: '' // error here
});


// Meanwhile...
// no ts error
// that's OK
const foo3: IFunction<IStore> = () => ({
  test: ''
});

// and...
// ts error: Type '{ test2: string; }' has no properties
// in common with type 'Partial<IStore>'
// that's OK
const foo4: IFunction<IStore> = () => ({
  test2: ''
});

Как я могу получить сообщение об ошибке "case 2" (foo2) в "case 1" (foo1) без ... (): IStore => ...?

1 Ответ

0 голосов
/ 06 июня 2019

Typescript иногда применяет строгую проверку свойств, а иногда нет. Когда применяется двоеточие, всегда применяется строгая проверка свойств (за исключением аргументов функции). Когда двоеточие не применяется, сравнивается структура, чтобы увидеть, соответствует ли структура псевдонима, если true, типы совместимы, и это является ядром структурной типизации. Эта проверка двоеточия применяется к ближайшему двоеточию в области.

IStore или Partial, если для ReturnType применяется двоеточие, может иметь только {test: string} или {}; но никогда не лишние свойства. * 1003 то есть *

const foo2 = (): Partial<IStore> => ({}); // is allowed but...
const foo2 = (): Partial<IStore> => ({notALlowed: true}); // not allowed

Когда двоеточие не применяется, оно выполняет структурную проверку типа с избыточным свойством off, это случай псевдонима типа для функции.

type IFunction<S> = (store: S) => Partial<S>;


const foo1: IFunction<IStore> = () => ({
  test: '',
  test2: '' // why no errors in this row?
});

Теперь может возникнуть некоторая путаница, потому что оба фрагмента реализуют двоеточие, но различие заключается в том, где двоеточие расположено, в случае функций двоеточие слева будет применять только строгую проверку свойств для аргументов функции, но никогда ReturnType.

...