【发布时间】:2019-10-13 00:57:48
【问题描述】:
我是 TypeScript 的新手,具有强大的 C# 背景。
我想知道类型推断在 TypeScript 中的以下情况下似乎不起作用但在 C# 中起作用的确切原因是什么:
打字稿:
interface IResult { }
interface IRequest<TResult extends IResult> { }
interface ISomeResult extends IResult {
prop: string;
}
interface ISomeRequest extends IRequest<ISomeResult> { }
function Process<TResult extends IResult>(request: IRequest<TResult>): TResult {
throw "Not implemented";
}
let request: ISomeRequest = {};
let result = Process(request);
// Error: Property 'prop' does not exist on type '{}'.
console.log(result.prop);
C#
interface IResult { }
interface IRequest<TResult> where TResult : IResult { }
interface ISomeResult : IResult
{
string Prop { get; set; }
}
interface ISomeRequest : IRequest<ISomeResult> { }
static TResult Process<TResult>(IRequest<TResult> request) where TResult : IResult
{
throw new NotImplementedException();
}
static void Main()
{
ISomeRequest request = default;
var result = Process(request);
// OK
Console.WriteLine(result.Prop);
}
这是 TS 编译器的类型推断算法的问题(可能还没有?)还是有一些我遗漏的根本原因使这在 TS 中变得不可能?
【问题讨论】: