您正在寻找的特定功能(例如“任意表达式的类型注释”)在 TypeScript 中不存在。有一个开放的建议 https://github.com/microsoft/TypeScript/issues/7481因为它目前标记为“需要提案”,因此您可能需要给它一个????,或者描述您的想法(如果它们令人信服并且与现有内容不同)。但在我看来,似乎没有人在做这件事,所以如果我是你,我就不会屏住呼吸。
这里有多种方法,每种方法都有自己的问题。
正如您所看到的,最简单的方法是使用类型断言 https://www.typescriptlang.org/docs/handbook/basic-types.html#type-assertions。这可以防止您传入完全不相关 type:
// assertion
someFunction({ foo: "bar" } as ITestInterface); // okay as expected
someFunction({ unrelatedThing: 1 } as ITestInterface); // error as expected
它还允许额外的属性(这仍然是声音和类型安全的,类型的对象ITestInterface
不能保证not拥有其他属性......这可能会让您感到惊讶,因为您期望超额财产检查 https://www.typescriptlang.org/docs/handbook/interfaces.html#excess-property-checks,但这些只会有时发生):
someFunction({ foo: "bar", hello: true } as ITestInterface); // okay by design,
// excess properties are allowed
但这里最重要的问题是类型断言让您不安全地缩小类型,因此以下不会是错误:
someFunction({} as ITestInterface); // no error ?! assertions also NARROW types
另一种方法是创建一个名为的辅助函数isType
像这样:
// helper function
const isType = <T>(x: T) => x;
这几乎完全符合您的要求:
someFunction(isType<ITestInterface>({ foo: "bar" })); // okay as expected
someFunction(isType<ITestInterface>({ unrelatedThing: 1 })); // error as expected
someFunction(isType<ITestInterface>({ foo: "bar", hello: true })); // error as you want
someFunction(isType<ITestInterface>({})); // error as everyone wants
但是,正如您所说,这对您来说可能不值得。大多数运行时引擎都会乐意内联函数,例如x => x
所以我不认为这是一个表现问题。但这可能是一个优雅问题,这取决于你。
无论如何,这些是我能做的最好的了。希望有帮助。祝你好运!
链接到代码 https://www.typescriptlang.org/play/#code/JYOwLgpgTgZghgYwgAgJIBUIGcyvNeJZAbwChlkYB7KgLmRylAHMBuUgX1JgFcQEwwKiAZUAthABifAUJAAKAB70+AaxBUA7iACUJLqQTCcyAA5wsWALIR6GbLnyxEKALwlKNegCIARnChvZA52LHEpGUFheXNLGx12UgB6JOQLLGgokFIwiWl+LPliTzpkPwCgjjSsNEwcPEhnJATkFOQqVTgAT2rkCEVTCAEIABMc8PzZaOK+KAgAGzhIEfQACxZ6AEZg3vt6p0IIFrboKCooXv7B4bHxvMi5IpKff0CAGmRVhfnSsCgeFBVCy1BwNAguY6pDrdZC+HojbDAZggN7JVL9JCWMxnQZQQTYNJzNLzH6aUakO4RAqPYhAmp7RyNQ6Q5AaPpQM4XAD8AEJqhk8XIanB5mFkAA5ACCACVpQB5ADqyDAXUGWApaM+C1xlAewkMxjAyGAWHQqrcyAAPOgAHxKejoPSuG3IRSJXJUqYKE1mwaWhlgpoQO3FailcqBYI6FnQnrAq5DZaUyaFH3m-11RngpAh5CzBZLUZrDbIbYcaOsVrojnnS4DRPk5N672m9MBg4uXNhl4VD5fEm-f6AitV9mc3pdKg8ZCaODgJvU6Jpv3tpmdorllmnWvxgBu0EnIBQs-A6qAA